7

友人から送られてきたコードを見ていたら、「コンパイルされますが、機能しません」と言われました。彼が括弧なしで関数を使用しているのを見ました。次のようなものです。

void foo(){
  cout<< "Hello world\n";
}

int main(){
  foo; //function without parentheses
  return 0;
}

私が最初に言ったのは「かっこを使う、あなたはしなければならない」でした。次に、そのコードをテストしました。コンパイルは行われますが、実行しても機能しません(「Helloworld」は表示されません)。

では、なぜコンパイルされるのですか(コンパイラGCC 4.7からの警告はまったくありません)が、機能しませんか?

4

3 に答える 3

12

警告レベルを十分に高く設定すると、確実に警告されます。

関数名は関数のアドレスに評価され、正当な表現です。通常、関数ポインタに保存されますが、

void (*fptr)() = foo;

しかし、それは必須ではありません。

于 2012-06-18T11:59:40.737 に答える
11

使用する警告レベルを上げる必要があります。foo;は有効な式ステートメントです(関数の名前は名前付き関数へのポインターに変換されます)が、効果はありません。

私は通常、次のようなものを使用-std=c++98 -Wall -Wextra -pedanticします。

<stdin>: In function 'void foo()':
<stdin>:2: error: 'cout' was not declared in this scope
<stdin>: In function 'int main()':
<stdin>:6: warning: statement is a reference, not call, to function 'foo'
<stdin>:6: warning: statement has no effect
于 2012-06-18T12:00:30.367 に答える
3
foo;

ここで関数を実際に「使用」しているわけではありません。あなたはそれのアドレスを使用しているだけです。この場合、あなたはそれを取っていますが、実際には使っていません。

関数のアドレス(つまり、括弧なしの名前)は、その関数を他の関数へのコールバックとして渡したい場合に役立ちます。

于 2012-06-18T12:00:46.447 に答える