当我使用没有括号的函数时,为什么C ++编译器不会抱怨?

时间:2012-06-18 11:57:15

标签: c++ compilation parentheses

我正在查看朋友寄给我的一些代码,他说:“它编译,但不起作用”。我看到他使用了没有括号的函数,如下所示:

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

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

我说的第一个是“使用括号,你必须”。然后我测试了那段代码 - 它确实编译了,但是当执行时不起作用(没有显示“Hello world”)。

那么,为什么要编译(编译器 GCC 4.7 完全没有警告),但不起作用?

3 个答案:

答案 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;

你实际上并没有'使用'这里的功能。你只是使用它的地址。在这种情况下,你正在接受但不是真的使用它。

当您想要将该函数作为回调函数传递给其他函数时,函数的地址(即它们的名称,没有任何括号)非常有用。