为什么在#include指令的fileName之后写任何东西,但在C程序中没有给出任何错误
#include <fileName.h> we can write anything in here and it will not give an error after program compilation
main() {
printf("Hello World");
}
这里是另一个示例:
#include "fileName.h" we can write here anything and its fine this will not give an error after compilation
main() {
printf("Hello World");
}
如果您从C规范中找到关于此行为的任何信息,则阅读文档无济于事,请知道这里的链接C Documentation
包含的文件后不应有任何文本。
关于#include
状态的C标准的6.10.2节:
2形式的预处理指令
# include <h-char-sequence> new-line
在实现定义的位置序列中搜索标题由
<
和>
之间的指定序列唯一标识定界符,并导致整个指令替换该指令标头的内容。如何指定地点或标题确定的是实现定义的。3形式的预处理指令
# include "q-char-sequence" new-line
导致该指令被整个内容替换由
"
之间的指定顺序标识的源文件定界符。在指定的源文件中搜索实现定义的方式。如果不支持此搜索,或者搜索失败,伪指令将被重新处理,就好像它显示为# include <h-char-sequence> new-line
具有相同的包含序列(包括
>
字符(如果有))。4形式的预处理指令
# include pp-tokens new-line
(与前两个表单之一不匹配)是允许的。
include
之后的预处理令牌指令的处理方式与普通文本相同。 (每当前定义为宏名的标识符被替换为它的预处理令牌的替换列表。)指令所有更换后的结果应与两者之一匹配以前的表格。序列的方法<
和>
预处理令牌对之间的预处理令牌或一对“字符”合并为一个标头名称预处理令牌是实现定义的。
这些格式均不允许在包含的文件名后输入文本。实际上,在这种情况下,gcc和MSVC都会发出警告。
给出此代码:
#include <stdio.h> bogus text
int main()
{
return 0;
}
gcc 4.8.5输出:
x1.c:1:20: warning: extra tokens at end of #include directive [enabled by default]
#include <stdio.h> bogus text
^
以及MSVC 2015的输出:
x1.c
x1.c(1): warning C4067: unexpected tokens following preprocessor directive - expected a newline