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
'prosource' 카테고리의 다른 글
XDocument에서 XPath를 사용하는 방법? (0) | 2023.10.05 |
---|---|
chartjs 차트의 값을 동적으로 업데이트합니다. (0) | 2023.10.05 |
합성키를 외래키로(sql) (0) | 2023.10.05 |
가변 제품의 각 변동 설정에 사용자 정의 치수 필드 추가 (0) | 2023.10.05 |
SQL Server:날짜 시간 필드에 초를 추가하시겠습니까? (0) | 2023.09.25 |