11

このコードをコンパイルしました:

void foo(int bar...) {}

int main()
{
   foo(0, 1);
   return 0;
}

そして、コンパイル出力は本当に奇妙でした:

g++ test.c

出力:

何もない

gcc test.c

出力:

test.c:1:17: エラー: '...' トークンの前に ';'、',' または ')' が必要です

パラメータの後にコンマがないことは知っています。この質問は奇妙なコンパイル出力に関するものです。

これが C で無効である理由は理解できますが、C++ で有効である理由がわかりません。

4

4 に答える 4

11

他の答えは正しいです(私は賛成しました)が、参照を与えるだけです[8.3.5関数節3]:

パラメーター宣言節:

パラメタ宣言リストopt ... opt

パラメータ宣言リスト、...

つまり、コンマはC++ ではオプションですvoid foo(...)が、C ではオプションではありません。パラメーター宣言リストもオプションであるため、C++ で記述することもできます。

その理由については、C++ テンプレートでtest(...)は、"catch-all" 関数に SFINAE を使用する場合に一般的です。ただし、C では for の使用法がないためfoo(...)、違法です。

于 2012-08-26T19:25:00.817 に答える
7

問題は、C ++が許可することです

returntype funcname(optional_param...)

C はそうではありませんが、可変個引数関数の構文です。

于 2012-08-26T18:58:56.183 に答える
4

C 言語と C++ 言語の文法のあいまいな違いに出くわしただけです。はい、C++ では構文を使用できますが、C では使用できません。C++ では前のコンマ...はオプションですが、C では常に必須です。それだけです。

于 2012-08-26T19:34:24.953 に答える
0

f(...)を許可するために、C++ではコンマバージョンを使用できません。なぜですか。

void f(){}を考えてみましょう。Cではこれは「私は何でも受け入れる」ことを意味し、C++では「私は何も受け入れない」ことを意味します。(void f(void)はCでは「何も受け入れない」です)

C ++でCの「私は何でも受け入れる」関数を宣言するには、extern "C" void f(...);を記述する必要があります。

于 2012-08-26T23:06:17.773 に答える