这个问题正在寻找一个明确解释为什么这种行为是错误的标准引用.
以下代码包括<stdio.h>内部main,
int main()
{
#include <stdio.h>
printf("hello , world \n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
我怀疑这是什么行为?这种未定义的行为还是什么?
此外,我无法找到与其相关的文档.
编辑:问题是,我发现这个代码在某个地方类似于它,但我不能完全发布那个代码所以我发布了这种演示代码.我知道stdio.h在主要之外的放置.
C99,7.1.2/4:
[...]如果使用,标题应包含在任何外部声明或定义之外,并且应首先包含在它首次引用它声明的任何函数或对象之前,或者包含在任何类型或宏中.定义.
4/2:
如果违反了约束之外出现的''shall''或''shall not''要求,则行为未定义.
6.9/4:
正如5.1.1.1中所讨论的,预处理后的程序文本单元是一个翻译单元,它由一系列外部声明组成.这些被描述为"外部",因为它们出现在任何函数之外(因此具有文件范围).
所以我认为这是未定义的行为.