2016-10-21 5 views
5

-pedantic -Wallgccclang을 모두 사용하여 오류나 경고없이 컴파일하는 것으로 나타났습니다.함수의 매개 변수로서의 함수

#include <stdio.h> 

int x = 0; 

void func(int f(const char *)) { 
    f("func()!"); 
} 

int main(void) { 
    func(puts); 
} 

이 파라미터 f이 경우 int (*)(const char *) 기능하도록 포인터로 취급되는 것으로 보인다.

그러나 이것은 내가 본 적이 없거나 전혀 들리지 않은 행동입니다. 이 합법적 인 C 코드입니까? 그렇다면 함수에 대한 매개 변수로 함수가있을 때 어떤 일이 발생합니까?

+1

함수 포인터는 유효한 매개 변수이며, 예를 들어 서로 다른 콜백 함수를 전달할 수 있습니다. 그것들을받는 함수는 그 함수를 호출 할 수 있습니다. 아무런 문제가 없습니다. –

+1

이 경우 매개 변수의 타입은 "함수에 대한 포인터"가 아니라 "함수"로 작성되며,이 경우에는 대신 int (* f) (const char *)로 선언됩니다. – wefwefa3

+0

이것은 구문 설탕이며 선언을 읽기 쉽게 할 수 있습니다. 중복 된 질문의 대답에 대한 첫 번째 의견을 참조하십시오. –

답변

2

표준에서 허용됩니다. C99 표준 장 6.9.1에서 (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf에서했다) 한 다음 g의 정의를 읽을 수

int f(void); 
/*...*/ 
g(f); 

을 말할 수도, 또 다른 하나 개의 기능을 전달하려면

예 2

void g(int (*funcp)(void)) 
{ 
    /*...*/ 
    (*funcp)(); /* or funcp(); ... */ 
} 
동등

또는,

void g(int func(void)) 
{ 
    /*...*/ 
    func(); /* or (*func)(); ... */ 
} 
관련 문제