一个可能适用于 C 和 C++ 的菜鸟问题。假设我有
void myfunc() {
blah;
}
因此,我将此函数称为:
myfunc();
但是,当我使用以下命令“调用”它时,不会产生编译器错误:
myfunc;
程序运行,但 myfunc 没有被调用。那么,C++ 将其解释为什么?
现在,我在 Arduino IDE 中执行此操作,所有代码都是一大块,所以我没有遇到段错误等。所以也许这会在动态链接的主机上引发运行时错误。
一个可能适用于 C 和 C++ 的菜鸟问题。假设我有
void myfunc() {
blah;
}
因此,我将此函数称为:
myfunc();
但是,当我使用以下命令“调用”它时,不会产生编译器错误:
myfunc;
程序运行,但 myfunc 没有被调用。那么,C++ 将其解释为什么?
现在,我在 Arduino IDE 中执行此操作,所有代码都是一大块,所以我没有遇到段错误等。所以也许这会在动态链接的主机上引发运行时错误。
myfunc
没有括号的是内存中函数的地址。
例如,如果你必须将一个函数传递给其他函数,你会这样做。
一个很好的例子是在bsearch
c 标准库中,您需要在其中传递用户定义的比较器函数才能进行通用搜索。
在 Cmyfunc
或任何其他函数名中表示函数本身,它将被隐式转换为函数指针
指针函数
函数类型 T 的左值可以隐式转换为指向该函数的纯右值指针。这不适用于非静态成员函数,因为不存在引用非静态成员函数的左值。
https://en.cppreference.com/w/cpp/language/implicit_conversion#Function_to_pointer
并且()
是一个运算符,当应用于函数指针或函数对象时将调用该函数
内置函数调用运算符
函数调用表达式具有以下形式
E ( A1, A2, A3,... )
在哪里
- E 是一个命名函数的表达式
- A1, A2, A3,... 是一个可能为空的任意表达式列表,除了在顶层不允许使用逗号运算符以避免歧义。
命名函数的表达式可以是
- 引用函数的左值表达式
- 函数指针
- 选择成员函数的显式类成员访问表达式
- 隐式类成员访问表达式,例如在另一个成员函数中使用的成员函数名。
因此,没有函数调用运算符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]
编译器只计算表达式。由于您正在评估函数的名称,因此它基本上是无操作的。
就像这样:
int main() {
42; // evaluates 42 but does nothing with it
}
无论如何,您的编译器应该警告您表达式的结果未使用。