一个noob问题,probbaly适用于C和C ++。假设我有
void myfunc() {
blah;
}
所以,我用这个函数调用:
myfunc();
但是,当我用“
”“调用”它时,不会产生编译器错误myfunc;
程序运行,但myfunc不会被调用。那么,C ++将其解释为什么?
现在,我在Arduino IDE中执行此操作,这是一大块代码,所以我没有得到段错误等等。所以这可能会在动态链接主机上引发运行时错误。
答案 0 :(得分:3)
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,...可能是任意表达式的空列表,但顶层不允许使用逗号运算符以避免歧义。
命名该函数的表达式可以是
- 引用函数的左值表达式
- 指向功能的指针
- 选择成员函数的显式类成员访问表达式
- 隐式类成员访问表达式,例如在另一个成员函数中使用的成员函数名称。
醇>
因此,没有函数调用操作符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}}