这是什么类型的行为

What type of behaviour is this?

本文关键字:类型 是什么      更新时间:2023-10-16

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

下面的代码包括<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

C99, 7.1.2/4:

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

4/2:

如果违反超出约束范围的"应"或"不应"要求,则 行为未定义。

6.9/4:

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

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

在 C++11 中: 17.6.2.2/3:

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

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

尝试将头文件包含在 main 方法之外。喜欢这个。

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