为什么在#include指令的fileName之后写任何东西,在C程序中不会出现任何错误?

问题描述 投票:3回答:1

为什么在fileName指令的#include给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规范 lemme中找到关于此行为的任何信息,则阅读文档无济于事,请知道这里的链接C Documentation

c filenames
1个回答
1
投票

包含的文件后不应有任何文本。

关于#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
© www.soinside.com 2019 - 2024. All rights reserved.