我一直在寻找一些代码,一个朋友送我的,他说:“它编译,但不工作”。 我看到他用的功能,而括号,是这样的:
void foo(){
cout<< "Hello world\n";
}
int main(){
foo; //function without parentheses
return 0;
}
首先我说的是“使用括号,你必须”。 然后,我测试的代码 - 它编译,但在执行时不工作(不显示的“Hello world”)。
那么,为什么它编译(没有警告所有从编译器GCC 4.7),但不工作?
如果设置了警告级别足够高,那肯定警告。
函数名称求函数的地址,是一个合法的表达。 通常它被保存在一个函数指针,
void (*fptr)() = foo;
但不是必需的。
你需要增加您使用的警戒线。 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
foo;
你不是真正“使用”的功能在这里。 你只是使用它的地址。 在这种情况下,你正在做,但没有真正使用它。
当你想传递函数作为回调到一些其他功能的功能(即他们的名字,没有任何括号)地址是有用的。
文章来源: Why doesn't the C++ compiler complain when I use functions without parentheses?