这是什么类型的行为?

Omk*_*ant 0 c c++ gcc clang

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

以下代码包括<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在主要之外的放置.

mel*_*ene 5

C99,7.1.2/4:

[...]如果使用,标题应包含在任何外部声明或定义之外,并且应首先包含在它首次引用它声明的任何函数或对象之前,或者包含在任何类型或宏中.定义.

4/2:

如果违反了约束之外出现的''shall''或''shall not''要求,则行为未定义.

6.9/4:

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

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

  • @LuchianGrigore嗯? (2认同)
  • @LuchianGrigore当函数声明或定义上没有关键字'static'时,它隐含了外部链接.但这不是标准可能意味着什么.它只是意味着外部包含文件. (2认同)