我正在查看朋友寄给我的一些代码,他说:“它编译,但不起作用”。我看到他使用了没有括号的函数,如下所示:
void foo(){
cout<< "Hello world\n";
}
int main(){
foo; //function without parentheses
return 0;
}
我说的第一个是“使用括号,你必须”。然后我测试了那段代码 - 它确实编译了,但是当执行时不起作用(没有显示“Hello world”)。
那么,为什么要编译(编译器 GCC 4.7 完全没有警告),但不起作用?
答案 0 :(得分:12)
如果您将警告级别设置得足够高,它肯定会发出警告。
函数名称的计算结果是函数的地址,是一个合法的表达式。通常它保存在函数指针
中void (*fptr)() = foo;
但这不是必需的。
答案 1 :(得分: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
答案 2 :(得分:3)
foo;
你实际上并没有'使用'这里的功能。你只是使用它的地址。在这种情况下,你正在接受但不是真的使用它。
当您想要将该函数作为回调函数传递给其他函数时,函数的地址(即它们的名称,没有任何括号)非常有用。