“嵌套”#include如何在C中工作?

时间:2017-08-14 21:04:16

标签: c header

假设有一个库/ API或一堆我想要使用的代码(由其他人编写),它存储在任意文件夹中(如C:\ randoAPIs \ coolStuff \ includes)。假设我的main.c位于不同的文件夹,如C:\ MyCProjects \ coolProject,并使用coolStuff API,我将这个包含路径添加到我的IDE并添加#include“coolStuff.h”;它工作正常。

以下是问题:

让我们说“coolStuff.h”本身包含一些其他头文件,如#include“boringStuff.h”; boringStuff.h的编译器看起来在哪里?是否在我的main.c文件夹中?或者在coolStuff的包含文件夹中?包含路径中的任何/所有文件夹? 或者这是编译器特定的问题,我应该阅读文档

2 个答案:

答案 0 :(得分:2)

完全是实现定义的。 C11 6.10.2p3

  

3表格

的预处理指令
# include "q-char-sequence" new-line
     

导致由"分隔符之间的指定序列标识的源文件的全部内容替换该伪指令。 以实现定义的方式搜索指定的源文件。如果不支持此搜索,或者搜索失败,则重新处理该指令,就好像它已读取

一样。
# include <h-char-sequence> new-line
     

具有相同的包含序列(包括>个字符,如果有的话)来自原始指令。

请注意,不需要支持#include "coolStuff.h"。此外,#include "coolStuff.h"甚至可以映射到#include <COOLSTUF.H>之类的内容。 C11 6.10.2p5

  

5实现应为由一个或多个非数字或数字(6.4.2.1)组成的序列提供唯一映射,后跟一个句点(。)和一个非数字。第一个字符不应是数字。实现可以忽略字母大小写的区别,并在该句点之前将映射限制为八个重要字符。

答案 1 :(得分:0)

这是依赖于编译器的,但我建议在项目中添加自己的include目录,并将include文件保存在那里。然后,只需将此路径添加到编译器中的包含搜索列表即可。例如,对于gcc(windows){{1}}