제가 올바르게 이해했다면, xyz
이 abc
으로 전달되는 기능이 되길 원합니다, 맞습니까?
void xyz(void *p);
그리고 : 인수 my_func
알 수 있듯이
, 당신은 인수로 void *
를 받아 void
type (*func_pointer)(type, type, type, .......)
^^ ^ ^ ^ ^
| | | | | |
| | | argument types
| | pointer name
| This is a function pointer
return type
따라서, 당신은 같은 xyz
를 선언 할 필요가 반환하는 함수에 대한 포인터를 가지고 구현시 동일 :
void xyz(void *p){
statements;
}
당신이 잘못하고있는 것은 .h 파일에 작성한 줄이 xyz
이라는 함수 포인터를 정의한다는 것입니다. 당신이 소스 파일에 쓴 무엇 xyz = some_function;
도 입력으로 void *
을 취하고 void *
를 반환 이름 xyz
으로, 함수 쓴 적이 있기 때문에 함수 포인터 대신 의도였다 void
의, 값이 없습니다 .
당신이 int *x;
쓰기, x
가 int
에 대한 포인터입니다 :
은 어쩌면 이것은 당신이 덜 혼란스러워 할 수 있습니다. 그런 다음 int y;
에 *
이없고 x = &y;
을 쓸 수 있습니다.
기능과 동일합니다. void (*funcptr)(void *p);
이있는 경우 void some_func(void *p){}
(다시 *
을 다시 쓰지 않음)이라는 함수가 필요하고 funcptr = some_func;
을 작성하십시오. 함수 이름이 실제로 함수의 포인터이기 때문에 &
이 필요하지 않습니다. 당신은 그것을 더 명백하게 표현할 수 있습니다.
void xyz(void *p);
void xyz(void *p){
// ...
}
와는 API에 대한 포인터를 전달합니다 : 적절한
abc(xyz, 42, 7);
함수 이름이 자동으로 함수 포인터로 해석됩니다 당신이 다른 것처럼
저는 이것을 typedef void (* my_func_ptr) (void *);로 더 자주 보았습니다. –
네, 나도. 하지만 'my_func_t my_func_impl;'을 사용한이 트릭은 더 이상 가능하지 않습니다. 내가 편집 할게. – glglgl
불쾌감은 없지만, 나 자신을 포함한 많은 프로그래머는'my_func_t my_func_impl; '을보고 전역 변수라고 생각하고 아마도 함수 포인터라고 생각합니다. 그것은 프로그래머가 아닌 컴퓨터를위한 좋은 예입니다. 이와 같은 트릭은 [리눅스 커널의 typedef에 대한 엄격한 제한] (http://www.kernel.org/doc/Documentation/CodingStyle) (5 장, "Typedefs")을 초래했습니다. –