3

次の C/C++ プログラムがあり、すべての警告をオンにしてコンパイルします。

int foo(int x) { return 5; }

C++ コンパイラから、参照されていない仮パラメーターに関する警告が表示されます。署名が「int foo(int)」となるように「x」を削除すると、コンパイラは問題なく動作します。

一方、C コンパイラは名前付きパラメーターを好み、名前が付けられていない場合は警告を出します。

EDIT : 警告ではなく、エラーを発行します。

違いはなぜですか?根拠は何ですか?

PS GNU コンパイラ ツールチェーンを使用しています。

4

5 に答える 5

9

They are different languages, with different rules.

In C, function parameters must have names; I'm surprised that you get a warning rather than an error. I guess the rationale is that there's no good reason for an unused parameter; if you don't need it, then why should it exist? (Of course, there are valid cases for ignoring parameters, such as when using function pointers that specify a particular set of arguments; presumably, the powers that be didn't consider that common enough to be worth relaxing the rules for. If you need to ignore it, then (void)unused; should suppress any "unused parameter" warnings you might otherwise get.)

In C++, functions must often have a particular signature, in order to override a virtual function declared in a base class, or to match a particular usage of a template parameter. It's quite possible that not all the parameters of that signature are required for all overrides, in which case it's quite reasonable to ignore that parameter. I'm guessing that that's the rationale for allowing you to leave it unnamed.

于 2012-08-29T16:09:12.833 に答える
3

C の理由の 1 つは、識別子だけで構成される古いスタイルのパラメーター リストがまだ残っていることです。

int f(to)
double to; {
  return to;
}

したがって、基本的に識別子のみが表示される場合、これは型ではなく変数名であると想定する必要があります。

于 2012-08-29T16:40:28.340 に答える
1

C と C++ は異なる規則を持つ異なる言語であり、これは、他の言語とはあまり似ていない多くの領域の 1 つです。

C 2011 標準:

6.9.1 関数定義

...
5 宣言子にパラメータ型リストが含まれる場合、各パラメータの宣言には識別子が含まれます。ただし、パラメータ リストが type の単一のパラメータで構成される特殊なケースを除きますvoid。この場合、識別子はありません。宣言リストは続きません。

鉱山を強調します。

C++ 2011 ドラフト標準

8.4 関数定義 [dcl.fct.def]

8.4.1 一般 [dcl.fct.def.general]

...
6 [ 注: 未使用のパラメーターに名前を付ける必要はありません。例えば、

void print(int a, int) {
std::printf("a = %d\n",a);
}
— エンドノート]

ここで、なぜC はすべてのパラメーターが使用されているかどうかにかかわらず識別子を必要とし、C++ はそうではないのかというより大きな哲学的問題については、次のことを思い出してください。

  1. C は C++ より 10 年ほど前に誕生しました。
  2. C は、C 用のコンパイラーが書きやすいように設計されています。
  3. C は関数のオーバーロードをサポートしていません

要するに、C が未使用のパラメーターに名前を付けないことを許可する正当な理由はありません

于 2012-08-29T17:10:20.620 に答える
0

私はいつもそれについても疑問に思っていましたが、いずれにせよ、実際に引数に名前を付けることでx、そして本文のどこかで次のように言って、両方で機能させることができます。

(void)x;
于 2012-08-29T16:07:10.157 に答える
0

As you said, you can fix the warning in C++ by removing the parameter names. In C it is not allowed to leave out parameter names. So if your C compiler produced the same warning, there would be no way for you to remove it. So your C compiler does not produce such a warning.

于 2012-08-29T16:08:31.183 に答える