4
#include <sys/types.h>
//Line 2: typedef unsigned int uint;
//Line 3: typedef unsigned int uint;
int main() {
    uint a;
    return 0;
}

上記の C コードを指定すると、uint が で定義されているため、正常にコンパイルされ<sys/types.h>ます。標準化されていませんが、Sys V との互換性のために追加されており、コードにコメントされています。

上記のコードの 2 行目のコメントを外しても、コンパイルは成功します。私が理解しているように、1 つの型を再定義することは許可されていません。これは、2 行目と 3 行目のコメントを外すことで確認できます。これにより、1 つのコンパイル エラーが発生します。

uint が標準ライブラリまたはユーザーのコードで定義されていることをコンパイラが十分に認識できるのはなぜですか? gcc と clang の両方で一貫した動作が得られます。

編集: この場合、リンクはゲームの一部ではありません。エラーはコンパイルのみ、つまり (-c オプション) で再現されます。

混乱を避けるために行番号が追加されています。

編集:

上記のコードの 2 行目のコメントを外しても、コンパイルは成功します。私が理解しているように、1 つの型を再定義することは許可されていません。これは、2 行目と 3 行目のコメントを外すことで確認できます。これにより、1 つのコンパイル エラーが発生します。

なぜこれを書いたのかわかりません。どうやら、行 2 と行 3 のコメントを外しても、gcc のコンパイル エラーにはなりません。Clang は、デフォルトのコンパイル オプションがはるかに厳密であり、いくつかのパラメーターを渡すことで調整できるため、エラーを返します。

ここでは、複数の typedef が許可されているかどうかについて説明します。これは非常に複雑であることがわかります。とにかく、typedef の重複を避けるようにしてください。

4

2 に答える 2

2

宣言を繰り返すことはCで完全に有効であるため、説明したように両方の行のコメントを外しても、あなたの言うことに反してエラーは表示されません。

1 つの名前に 2 つの異なる宣言があると、エラーになります。

定義を繰り返すこともエラーですが、typedef は定義ではなく ( にもかかわらずdef)、宣言です。

于 2013-03-11T16:29:48.113 に答える
1

標準ライブラリはユーザー コードでもあり、通常は別のユーザーによって記述されます。

上記のコードの 2 行目のコメントを外しても、コンパイルは成功します。私が理解しているように、1 つの型を再定義することは許可されていません。これは、2 行目と 3 行目のコメントを外すことで確認できます。これにより、1 つのコンパイル エラーが発生します。

私のgccではそうではありません。(バージョン 4.5.3)

uint が標準ライブラリまたはユーザーのコードで定義されていることをコンパイラが十分に認識できるのはなぜですか? gcc と clang の両方で一貫した動作が得られます。

コンパイラは、ユーザー コードと標準ライブラリ内のコードを区別しません。コンパイラは標準ライブラリ ファイルとユーザー コードを区別できますが、そうする理由はまったくありません。見えるのは、lex/parse/codegen できるテキスト データだけです。

于 2013-03-10T21:03:01.063 に答える