6

在下面的代码片段中,主函数调用 foo 函数,没有任何参数和括号。奇怪的是这段代码可以被gcc编译。我实际上检查了汇编代码,发现编译器只是忽略了这一行。所以我的问题是在什么情况下使用这种代码?或者 gcc 的支持只是一个巧合,实际上它完全没有用。

int foo(int a,int b)
{
    return a+b;
}
int main()
{
    foo;      // call foo without parameter and parenthesis
    return 0;
}

objdump -d 转储的汇编代码

00000000004004c0 <main>:
  4004c0:   55                      push   %rbp
  4004c1:   48 89 e5                mov    %rsp,%rbp
  4004c4:   b8 00 00 00 00          mov    $0x0,%eax
  4004c9:   5d                      pop    %rbp
  4004ca:   c3                      retq   
  4004cb:   0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)
4

3 回答 3

12

这与使用任何其他类型的表达式并忽略其值没有什么不同,例如:

int main(void)
{
  42;
  return 0;
}

没有什么特别的,这不是调用函数,因为()没有使用函数调用运算符。你所做的只是“计算”函数的地址,然后忽略它。

于 2012-12-14T15:38:35.850 回答
7

计算表达式foo(给出函数的地址),结果被丢弃。如果没有()运算符,则不会调用该函数。

于 2012-12-14T15:38:23.283 回答
1

foo没有被调用,它只是被引用(而不是分配给任何东西)。

于 2012-12-14T15:36:24.380 回答