2014-12-22 1 views
1

함수 포인터가 어떻게 작동하는지 이해하려고합니다.
기능에서 '무효 F3()':
"경고 :왜 "bool의 주소가 항상 사실로 평가됩니까?"

bool f1(int x){ 
    if(condition){return true;} 
    else return false; 
} 

bool f2(int x, bool (*func)(int)){ 
    if (func(x)){return true;} 
    else return false; 
} 

void f3(int x, bool (*func)(int, bool)){ 
    if (func(x, f1)) {return "Whatever";} 
    else return "Nevermind"; 

int main(){ 
    f3(x, f2); 
} 

이 나에게주는 : 부울의 ADRESS을 'F1 (int)를'항상 '참'으로 평가하는 것이다이 설정을 나타냅니다 [int] bool (*) (int, bool) to 'bool () (int, bool ())'에서 'int main() '

얼마나 엉망입니까?

+0

을, 당신 아마 그것을 부르고 싶었다. – bialpio

+2

'if (condition) 대신 true를 반환; 그렇지 않으면 false를 반환합니다. '반환 조건;의 습관을 들여야합니다. 훨씬 간단하고 짧으며 똑같은 일을합니다. –

답변

1
void f3(int x, bool (*func)(int, bool)){ 
           ^^^^ 

f3의 두 번째 매개 변수는 bool의 두 번째 인수로 함수에 대한 포인터입니다.

f2f3에 전달하고, f3에서 호출 할 함수의 형태이지만, f2의 두 번째 매개 변수는 bool (*)(int)을 입력있다.

그래서 f3 이에 따라 선언해야합니다

void f3(int x, bool (*func)(int, bool (*)(int))) 

참고 :이 적절 typedef를 사용하여 훨씬 더 읽기 쉽게 만들 수 있습니다 : 당신은 기능`f1`의 주소를 전달하는

typedef bool f1_t(int); 
typedef bool f2_t(int, f1_t*); 

bool f1(int x) { ... } 
bool f2(int x, f1_t* func) { ... } 
void f3(int x, f2_t* func) { ... } 
1

함수 포인터는 함수 주소에서 직접 생성하는 경우 항상 null이 아니며 null 포인터 만 false으로 평가됩니다.

func의 두 번째 매개 변수는 bool 일 필요가 있지만 함수의 이름을 전달하는 것입니다. 함수는 함수에 대한 포인터로 자동 변환되어 위의 규칙을 사용하여 자동으로 bool으로 변환됩니다.