3

C で変数を宣言するとき、型を省略できる場合がありますint

K&R スタイルで宣言されていない限り、パラメーターの明示的な 'int' 型を省略すると、他の非 int パラメーターを使用して gcc でコンパイルできないのはなぜですか?

このコードはエラーを生成します:

main(argc, char *argv[])
{
  /* . . . */
}

次の出力を使用します。

$gcc XXX.c -oXXX
XXX.c:X:X: error: expected ‘)’ before ‘char’
 main(argc, char *argv[])
            ^

ただし、パラメーターに K&R スタイルの型を記述した場合int、最初のパラメーターの型の指定を省略できます。

main(argc, argv)
char *argv[];
{
  /* . . . */
}

そして、それはうまくコンパイルされます。

その理由は、最初の C 標準を作成したときに、K&R 自動 int 表記を関数パラメーターの新しい構文から完全に分離する必要があると判断したためだと思われます。特に、標準がまとめられるまでに自動 int 表記はおそらくすでに貧弱な表記と見なされています。

これらの規則に対する私の関心は学術的なものであり、通常、この古いスタイルの C を書くことはありません。

4

2 に答える 2

3

C の関数定義には、K&R スタイルとプロトタイプを使用したモダン スタイルの 2 つの形式があります。これらを 1 つの定義に混在させることはできません。

K&R スタイル (つまり、言語の最初の公式 ANSI 標準の 11 年前に発行された、Kernighan & Ritchie の「C プログラミング言語」の 1978 年初版で使用されたスタイル) では、次のように記述できます。

/* Valid in K&R and 1989 ANSI C, invalid in C99 and later */
main(argc, argv)    
char *argv[];
{
    /* . . . */
}

括弧内のものは、識別子の (場合によっては空の) シーケンス、パラメーターの名前のみにすることができます。との間に、)必要{に応じて一連のパラメーター宣言を指定して、それらの型を指定することができます。パラメータまたは関数自体の型を省略した場合、デフォルトで になりますint

1989 年の ANSI C 標準では、下位互換性のためにこの古い形式が維持されましたが、廃止されると宣言されました。(残念ながら、私見ですが、2011 年の ISO C 標準でもそのままです。)

1999 年の ISO C 標準では "implicit int" ルールが廃止されたため、何らかの奇妙な理由で古いスタイルの定義を使用したい場合でも、すべての型を明示的に指定する必要があります。

 /* Valid in all versions of C, but obsolescent */
int main(argc, argv)
int argc;
char *argv[];
{
    /* ... */
}

の最新のプロトタイプ定義は次のmainようになります。

/* Valid in 1989 ANSI C and later; write it this way! */
int main(int argc, char *argv[]) { 
    /* ... */
}

常にプロトタイプを使用する必要があります。古いスタイルの関数定義を書く正当な理由はありません (非常に古いコンパイラを使用している場合を除きますが、そのようなコンパイラを見つけることさえ非常に困難になっています)。

于 2013-08-25T21:17:24.690 に答える