为什么没有C ++编译器抱怨,当我使用功能,而括号?(Why doesn't the C++

2019-06-25 13:37发布

我一直在寻找一些代码,一个朋友送我的,他说:“它编译,但不工作”。 我看到他用的功能,而括号,是这样的:

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

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

首先我说的是“使用括号,你必须”。 然后,我测试的代码 - 它编译,但在执行时不工作(不显示的“Hello world”)。

那么,为什么它编译(没有警告所有从编译器GCC 4.7),但不工作?

Answer 1:

如果设置了警告级别足够高,那肯定警告。

函数名称求函数的地址,是一个合法的表达。 通常它被保存在一个函数指针,

void (*fptr)() = foo;

但不是必需的。



Answer 2:

你需要增加您使用的警戒线。 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


Answer 3:

foo;

你不是真正“使用”的功能在这里。 你只是使用它的地址。 在这种情况下,你正在做,但没有真正使用它。

当你想传递函数作为回调到一些其他功能的功能(即他们的名字,没有任何括号)地址是有用的。



文章来源: Why doesn't the C++ compiler complain when I use functions without parentheses?