这是什么类型的行为
What type of behaviour is this?
这个问题正在寻找一个标准的引用,明确解释为什么这种行为是错误的。
下面的代码包括<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;
}
相关文章:
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- 如何声明一个标准::提升直方图的向量?提升直方图的类型是什么?
- 类名后跟括号的类型是什么
- std::chrono::duration::count函数的实际结果类型是什么
- c++运算符重载-我实际返回的操作数类型是什么
- 运算符和返回类型是什么意思?
- 指向 2D 数组的指针的类型是什么?
- RSA_verify中预期的数据类型是什么,无法验证从 Java 生成的签名
- 共享_ptr中多功能数组的类型是什么
- 构造函数的类型是什么?
- 字符串中单个字符作为数组的数据类型是什么
- 该结构继承的类型是什么
- 如果我获得Integer和Double的产品,输出的数据类型是什么
- C 中被视为可可的类型是什么
- 当函数采用右值引用时,函数中该变量的类型是什么?
- STD :: SETW,STD :: SETFILL等的真实返回类型是什么?
- 模板类中引用的引用的类型是什么
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 包含通过引用捕获的 lambda 函数的"variable"的类型是什么?
- 通过插座发送的内容的数据类型是什么