什么是“myfunc”vs“myfunc()”

时间:2013-10-23 02:42:29

标签: c++

一个noob问题,probbaly适用于C和C ++。假设我有

void myfunc() {
    blah;
}

所以,我用这个函数调用:

myfunc();

但是,当我用“

”“调用”它时,不会产生编译器错误
myfunc;

程序运行,但myfunc不会被调用。那么,C ++将其解释为什么?

现在,我在Arduino IDE中执行此操作,这是一大块代码,所以我没有得到段错误等等。所以这可能会在动态链接主机上引发运行时错误。

3 个答案:

答案 0 :(得分:3)

没有parens的

myfunc是内存中函数的地址。

例如,如果你必须将一个函数传递给其他函数,你就可以使用它。

这方面的一个很好的例子是在c标准库的bsearch中,你需要传递用户定义的比较器函数才能进行通用搜索。

答案 1 :(得分:1)

编译器只评估表达式。由于您正在评估函数的名称,因此它基本上是无操作。

就像这样:

int main() {
    42; // evaluates 42 but does nothing with it
}

无论如何,您的编译器应警告您表达式的结果未使用。

答案 2 :(得分:1)

在C myfunc或任何其他函数名称中表示函数本身,它将隐式转换为function pointer

  

指针

的功能      

函数类型T的左值可以隐式转换为该函数的prvalue指针。这不适用于非静态成员函数,因为不存在引用非静态成员函数的左值。

     

https://en.cppreference.com/w/cpp/language/implicit_conversion#Function_to_pointer

() is an operator当应用于函数指针或函数对象时将调用该函数

  

内置函数调用操作符

     

函数调用表达式的格式为

E ( A1, A2, A3,... )
     

,其中

     
      
  • E是一个命名函数的表达式
  •   
  • A1,A2,A3,...可能是任意表达式的空列表,但顶层不允许使用逗号运算符以避免歧义。
  •   
     

命名该函数的表达式可以是

     
      
  1. 引用函数的左值表达式
  2.   
  3. 指向功能的指针
  4.   
  5. 选择成员函数的显式类成员访问表达式
  6.   
  7. 隐式类成员访问表达式,例如在另一个成员函数中使用的成员函数名称。
  8.   

因此,没有函数调用操作符myfunc;只是一个包含函数指针的无操作表达式。如果您打开了编译器警告(您应该这样做),那么他们shout at you about the issue。海湾合作委员会说

statement is a reference, not call, to function 'func' [-Waddress]
warning: statement has no effect [-Wunused-value]

而Clang输出{{​​1}}