2016-06-04 1 views
5

모든 함수가 동일한 반환 유형을 공유한다고 가정하면 빈 괄호로 선언 된 "일반"함수 포인터로 각 함수를 호출 할 수 있습니까 (인수를 지정하지 않으므로)? 정확히 그런 식으로pseudo-generic 함수 포인터로 다른 프로토 타입을 가진 함수를 호출 할 수 있습니까?

#include <stdio.h> 

void fun1(void) 
{ 
    printf("fun1\n"); 
} 

void fun2(int a) 
{ 
    printf("fun2: %d\n", a); 
} 

void fun3(int a, int b) 
{ 
    printf("fun3: %d %d\n", a, b); 
} 

int main(void) 
{ 
    void (*pf)(); // pseudo-generic function pointer 

    pf = fun1; 
    pf(); 

    pf = fun2; 
    pf(0); 

    pf = fun3; 
    pf(1, 2); 

    return 0; 
} 
+1

가능한 인수 유형이없는 함수 포인터? (http://stackoverflow.com/questions/20835534/function-pointer-without-arguments-types) –

+0

흥미로운 질문입니다. "컴파일하고 예상대로 실행합니까?"와 같이 유효합니다. 예, "경고없이'-Wall' 컴파일로 작동합니까? 내 컴파일러에 예 :-) – Dilettant

+0

네, 편집증 모드에서도 경고하지 않습니다'-Wall -Wextra -pedantic -Wconversion' by GCC 4.9 ... @Dilettant – alk

답변

6

당신은 유사한 물건을 할 수 있지만 : 여기

는 그것을 설명, 예제 코드입니다. 함수 포인터를 통해 함수를 호출 할 때 호출 측 프로토 타입이 함수가 정의 된 것과 정확히 일치하는지 확인해야합니다.

이제 빈 괄호가있는 함수 선언은 프로토 타입조차 아닙니다. 따라서이 함수를 호출하는 올바른 방법이 아닙니다. 주된 이유는 호출 규칙이 예상했던 것과 약간 다를 수 있기 때문입니다. () 함수의 경우 특수 규칙이 적용됩니다. 즉 좁은 유형은 int, unsigned 또는 double으로 변환됩니다. 당신이 할 수 있습니다 무엇을 지금

저장pf에서 함수 포인터 당신처럼,하지만 당신은 항상 같은

((void (*)(int, int))pf)(a, b); 
로, 호출하기 전에 올바른 함수 포인터로 다시 변환해야 할 것

이것은 거의 읽을 수없고 오류가 많습니다. 가능한 한 많이 체조를 피해야합니다.