c - 활용 - 함수포인터란




C에서 함수 포인터를 통해 정적 함수를 호출 할 수 있습니까? (5)

필자는 소스 파일의 정적 함수를 파일 외부에서 직접 호출 할 수 없다고 생각합니다. 그러나, 어떻게 든이 함수에 대한 포인터를 다른 파일로 가져 오면이 파일에서이 함수를 호출 할 수 있습니까? 예인 경우 단순히이 기능을 비 정적으로 만드는 것과 비교하여이 경로를 취할 때 어떤 시나리오가 있습니까?


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

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

나는 시나리오에 대해 잘 모르겠습니다. 아마도 다른 사람들이 함수를 호출 한 후에 만 다른 사람들이 함수를 호출하기를 원할 수도 있습니다 (물론 정적이 아닙니다). 그래서 당신은 그것들을 얻고 그것을 부를 수 있습니다.


그래 넌 할수있어. 함수 포인터를 콜백으로 간주해야하는 함수를 호출해야하는 경우 static을 사용하여 함수 심볼이 전역 네임 스페이스를 오염시키지 않고 링커 충돌을 일으키지 않도록 할 수 있습니다. 가장 많이 사용되는 예제는 아마도 qsort입니다.

struct Data { ... };

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

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

예, 정적 함수를 포인터를 전달하여 내보낼 수 있습니다. 이는 C에서 팩토리 패턴 을 구현하는 일반적인 방법으로,이를 사용하는 모듈에서 모든 함수의 구현을 숨길 수 있으며 FuncPtr_t GetFunction( enum whichFunctionIWant) 을 사용하여 소비자에게 FuncPtr_t GetFunction( enum whichFunctionIWant) 수 있습니다. 이것이 동적 링크 구현이 작동 하는 방식입니다.


예, 파일의 비 정적 함수는 정적 함수에 대한 포인터를 원하는 위치로 반환 할 수 있습니다.


작은 정적 함수를 다른 함수에 대한 작업자 함수로 정의하는 것이 종종 유용합니다. 예를 들어 표준 qsortqsort , 비교 함수가 필요할 것이고, 매우 자주 비교 함수를 정적으로 만드는 것이 낫습니다. (예를 들어 다른 곳에서는 유용하지 않고 qsort 가 unpretty 서명을 원하기 때문입니다).





function-pointers