这是什么类型的行为?

时间:2012-12-03 06:07:08

标签: c++ c gcc clang

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

以下代码包括<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。 p>

3 个答案:

答案 0 :(得分:5)

C99,7.1.2 / 4:

  

[...]如果   使用时,标题应包含在任何外部声明或定义之外,并且它   应首先包括在第一次提及任何功能或对象之前   声明,或声明它定义的任何类型或宏。

4/2:

  

如果违反约束之外的''应'或''不应''要求,则   行为未定义。

6.9 / 4:

  

如5.1.1.1所述,预处理后的程序文本单位是翻译单位,   它由一系列外部声明组成。这些被描述为''外部''   因为它们出现在任何函数之外(因此具有文件范围)。

所以我认为这是未定义的行为。

答案 1 :(得分:2)

在C ++ 11:17.6.2.2/3中:

  

翻译单位应仅在任何外部声明或定义之外包括标题,并且应当   在该翻译单元中的第一个引用之前以词汇方式包含标题到声明的任何实体   在那个标题中。

main()是extern,因此不适合包含。

答案 2 :(得分:-2)

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

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