6

次のコード スニペットでは、main 関数はパラメーターと括弧なしで 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 に答える