2012-06-18 1 views
7

친구가 보낸 코드를보고 있었는데 그는 "컴파일했지만 작동하지 않습니다."라고 말했습니다.괄호없이 함수를 사용할 때 C++ 컴파일러가 불평하지 않는 이유는 무엇입니까?

void foo(){ 
    cout<< "Hello world\n"; 
} 

int main(){ 
    foo; //function without parentheses 
    return 0; 
} 

가 첫 번째 I는 "괄호를 사용, 당신은해야한다"라고 말했다 : 나는 그가, 괄호없이 이런 일을 기능을 사용하는 것을 보았다. 그런 다음 코드를 테스트했습니다. 컴파일되지만 실행되지 않습니다 ("Hello world"가 표시되지 않음).

그럼 컴파일러가 전혀 컴파일되지 않습니다 (GCC 4.7).하지만 작동하지 않습니다.

+0

실제로 작동하지 않습니다. 'foo'는 그대로 함수 포인터입니다. 'foo;'행은 아무 효과가없는 행입니다. 경고를 최대치로 설정하면 효력이없는 성명에 대한 경고를 받아야합니다. – RedX

+0

* "경고 : 문은 'foo'"* 및 * "warning : 문이 아무런 영향을 미치지 않습니다."를 호출하기 위해 호출이 아닌 참조입니다. -Wall -Wextra – Flexo

+3

으로 컴파일하고 싶을 것이다. (장래의 질문을 위해 샘플을 완성하기 위해'#include '과 네임 스페이스에 넣을 가치가있다.) – Flexo

답변

12

경고 수준을 충분히 높게 설정하면 반드시 경고 메시지가 표시됩니다.

함수 이름은 함수의 주소로 평가되며 유효한 표현식입니다. 일반적으로 함수 포인터에 저장됩니다.

void (*fptr)() = foo; 

이 필요하지는 않습니다.

11

사용하는 경고 수준을 높여야합니다. foo;은 유효한 표현식입니다 (함수의 이름이 명명 된 함수의 포인터로 변환됩니다). 그러나 아무 효과가 없습니다.

나는 보통 -std=c++98 -Wall -Wextra -pedantic를 사용 준다 :

<stdin>: In function 'void foo()': 
<stdin>:2: error: 'cout' was not declared in this scope 
<stdin>: In function 'int main()': 
<stdin>:6: warning: statement is a reference, not call, to function 'foo' 
<stdin>:6: warning: statement has no effect 
3
foo; 

당신은 여기 기능을 '사용'사실은 아니에요. 방금 주소를 사용하고 있습니다. 이 경우, 실제로 사용하지는 않지만 가져갑니다.

함수의 주소 (즉, 괄호가없는 이름)는 해당 함수를 다른 함수의 콜백으로 전달하려는 경우에 유용합니다.