不带参数和括号调用函数

8
在以下代码片段中,主函数调用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)

这里没有调用无括号的函数。然而,REBOL编程语言实际上允许您在不使用括号的情况下调用函数。 - Anderson Green
3个回答

12

这与忽略任何其他类型的表达式及其值没有区别,例如:

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

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


那么这样做的意义是什么?我遇到了一段代码,它也这样做,但我想不明白为什么。 - Jefferson Hudson
1
@JeffersonHudson 我认为这没有任何意义。任何理智的编译器都会将其编译为空,即它将被忽略,因为它没有副作用。它可能是调试的残留物,或者只是一个编辑错误。 - unwind

7
表达式foo被计算(得到函数地址),结果被丢弃。没有()操作符,函数不会被调用。

1
foo 并没有被评估。 foo 只是源代码中可读的名称,它指向一个函数的地址。这个地址没有被调用,因此还没有任何“结果”可以丢弃。 - Alexander
@Alexander 123 是 C 定义中的表达式,foo 也是。实际上任何东西都是表达式,任何表达式都会被求值。123 被求值为整数数字 123,123L 被求值为长整型数字 123,foo 被求值为函数地址。我同意评估不会在运行时发生,我明白你的意思。但是,理论上,在编译时,人可读的符号被计算并替换为其地址,然后被忽略(或简单地优化消失)。所以答案是正确的。 - FrancescoMM

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接