0

一个可能适用于 C 和 C++ 的菜鸟问题。假设我有

void myfunc() {
    blah;
}

因此,我将此函数称为:

myfunc();

但是,当我使用以下命令“调用”它时,不会产生编译器错误:

myfunc;

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

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

4

3 回答 3

3

myfunc没有括号的是内存中函数的地址。

例如,如果你必须将一个函数传递给其他函数,你会这样做。

一个很好的例子是在bsearchc 标准库中,您需要在其中传递用户定义的比较器函数才能进行通用搜索。

于 2013-10-23T02:46:24.733 回答
1

在 Cmyfunc或任何其他函数名中表示函数本身,它将被隐式转换为函数指针

指针函数

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

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

并且()是一个运算符,当应用于函数指针或函数对象时将调用该函数

内置函数调用运算符

函数调用表达式具有以下形式

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

在哪里

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

命名函数的表达式可以是

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

因此,没有函数调用运算符myfunc;只是一个包含函数指针的无操作表达式。如果您打开了编译器警告(您确实应该这样做),那么他们会就这个问题对您大喊大叫。海湾合作委员会说

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

而 Clang 输出warning: expression result unused [-Wunused-value]

于 2013-10-23T02:48:33.920 回答
1

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

就像这样:

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

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

于 2013-10-23T02:44:52.367 回答