prosource

C의 함수 포인터를 통해 정적 함수를 호출할 수 있습니까?

probook 2023. 10. 5. 23:22
반응형

C의 함수 포인터를 통해 정적 함수를 호출할 수 있습니까?

소스 파일의 정적 함수는 파일 외부에서 직접 호출할 수 없다고 생각합니다.그러나 어떻게든 이 함수에 대한 포인터를 다른 파일로 가져올 수 있다면 그 파일에서 이 함수를 호출할 수 있습니까?만약 그렇다면 단순히 기능을 정지 상태로 만드는 것보다 이 경로를 택하고 싶을 때 어떤 시나리오가 있습니까?

네, 포인터를 전달하여 정적 함수를 내보낼 수 있습니다.이것은 C에서 Factory 패턴을 구현하는 일반적인 수단입니다. 이 방법을 사용하는 모듈로부터 전체 함수의 구현을 숨길 수 있으며, 다음과 같은 기능을 가질 수 있습니다.FuncPtr_t GetFunction( enum whichFunctionIWant)그것들을 소비자들에게 나눠주는 것입니다.그만큼 많은 동적 연결 구현이 작동합니다.

그러나 어떻게든 이 함수에 대한 포인터를 다른 파일로 가져올 수 있다면 그 파일에서 이 함수를 호출할 수 있습니까?

네, 완벽하게 가능합니다.링커에는 함수가 보이지 않지만 실행 파일에는 있습니다.언제든지 주소로 이동할 수 있습니다.

하지만 시나리오에 대해서는 잘 모르겠습니다.다른 사용자가 다른 함수를 호출한 에만 함수를 호출하기를 원할 수도 있습니다(물론 정적 함수는 아닙니다).그래서 그들에게 그것을 얻도록 하고, 그들은 그것을 부를 수 있습니다.

다른 분이 말씀하신 것처럼 할 수 있습니다.당신이 원하는 이유의 예는 일종의 "드라이버"를 위한 것입니다.실제 기능을 공개적으로 액세스할 필요 없이 열기, 닫기, 읽기 및 쓰기 기능이 포함된 구조를 다시 전달할 수 있습니다.

네, 가능합니다.함수에 대한 포인터를 콜백으로 예상하는 함수를 호출해야 하는 경우 함수 기호가 글로벌 네임스페이스를 오염시키지 않고 링커 충돌을 일으키지 않도록 정적을 사용할 수 있습니다.가장 많이 사용되는 예는 아마도 qsort:

struct Data { ... };

static int compareData(const void* a, const void* b) { /* cast to Data and compare */ }

...
qsort(array, count, sizeof(Data), &compareData);

예, 파일에 있는 고정되지 않은 함수는 원하는 곳에 고정된 함수의 포인터를 반환할 수 있습니다.

예, 언제든지 직접 사용해 보고 다음을 확인할 수 있습니다.

파일1.c

#include <stdio.h>

void call_hello(void (*fptr)(void));

static void hello(void) {
   puts("hello");
}

int main(void)
{
   void (*fptr)(void) = hello;

   call_hello(fptr);

   return 0;
}

파일2.c

void call_hello(void (*fptr)(void))
{
   fptr();
}

종종 작은 정적 함수를 다른 함수의 작업자 함수로 정의하는 것이 유용합니다.기준을 보세요.qsort 것이 하지 않기 어,다,에어,하며) 에).qsort약간의 예쁜 서명이 있기를 원합니다.)

언급URL : https://stackoverflow.com/questions/8023213/can-a-static-function-be-called-through-a-function-pointer-in-c

반응형