0

この質問は、この動作が間違っている理由を明示的に説明する標準的な引用を探しています。

<stdio.h>内部を含む以下のコードmain

int main()
{
 #include <stdio.h>
 printf("hello , world \n");
 return 0;
}

On gcc -Wall in.c -o in.outIt は正常にコンパイルおよび出力されhello , worldます。

しかし、clang in.c -o in.outそれは私にこのエラーを与えます:

/usr/include/stdio.h:353:12: error: implicit declaration of 'fprintf' requires 

inclusion of the header <stdio.h>
extern int fprintf (FILE *__restrict __stream,
           ^
1 error generated.

私の疑問は、これはどのような行動ですか?これは未定義の動作ですか、それとも何ですか?

また、それに関連するドキュメントを見つけることができません。

編集:問題は、このコードをどこかに似ていることですが、そのコードを正確に投稿できないため、この種のデモコードを投稿しましstdio.hた.メインの外に配置することを知っています.

4

3 に答える 3

5

C99、7.1.2/4:

[...] ヘッダーを使用する場合、ヘッダーは外部の宣言または定義の外側に含める必要があり、宣言する関数またはオブジェクトのいずれか、またはヘッダーが宣言する型またはマクロのいずれかへの最初の参照の前に最初に含める必要があります。定義します。

4/2:

制約の外側にある「しなければならない」または「してはならない」要件に違反した場合、動作は未定義です。

6.9/4:

5.1.1.1 で説明したように、前処理後のプログラム テキストの単位は、一連の外部宣言から構成される翻訳単位です。これらは「外部」として記述されます。これは、関数の外に現れる (したがって、ファイル スコープを持つ) ためです。

したがって、これは未定義の動作だと思います。

于 2012-12-03T06:16:37.053 に答える
-2

メイン メソッドの外にヘッダー ファイルをインクルードしてみてください。このような。

#include <stdio.h>
int main()
{
 printf("hello , world \n");
 return 0;
}
于 2012-12-03T06:10:02.780 に答える