0

这个问题正在寻找一个标准的报价,明确解释为什么这种行为是错误的。

下面的代码包括<stdio.h>里面main

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

gcc -Wall in.c -o in.out它成功编译和打印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

在 C++11 中:17.6.2.2/3:

翻译单元应仅在任何外部声明或定义之外包含标头,并且应在该翻译单元中对在该标头中声明的任何实体的第一次引用之前在词法上包含标头。

main()是外部的,因此不是包含的适当上下文。

于 2012-12-03T06:22:59.673 回答
-2

尝试在 main 方法之外包含头文件。像这样。

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