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

Why doesn't the C++ compiler complain when I use functions without parentheses?

本文关键字:C++ 编译器 函数 为什么      更新时间:2023-10-16

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

void foo(){
  cout<< "Hello worldn";
}
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;

您实际上并没有在这里"使用"该功能。 你只是在使用它的地址。 在这种情况下,您正在服用它,但并未真正使用它。

函数

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