响水凹

欢迎来到 Guang-Wen Duan (Dennis Duan) 的个人 Wiki

用户工具

站点工具


computer:c:tips:file_inclusion

#include文件包含(File inclusion)

标准C支持三种形式的#include指令:

  1. #include <...>
  2. #include "..."
  3. #inlcude preprocessor-tokens

<>和""之间的内容通常是一个依赖于实现的文件名,文件名中可以有三元组(trigraph)和续行符。

使用<>还是""依赖于具体实现对文件存放位置的定义。通常<>表示文件存放于实现的一些标准位置,而""表示在查找标准位置之前,先在一些本地位置查找,如当前目录。

第三种形式的preprocessor-tokens执行正常的宏扩展,扩展后的结果必须符合前两种形式。

例如:

#if some_thing==this_thing
#define includefile "thisname.h"
#else
#define includefile <thisname.h>
#endif
...
#include includefile

一些非标准的实现对此的行为有很大不同,为了兼容,更好的方法是:

#if some_thing==this_thing
#include "thisname.h"
#else
#include <thisname.h>
#endif

include的文件里面还可以包含#include指令,能嵌套的最大层数依赖于实现,标准C要求至少能嵌套8层(C99提高到15层)。

嵌套存在一个路径问题。如/near/first.c中有:

#include "/far/second.h"

而/far/second.h包含:

#include "third.h"

这里的third.h应该在/near目录还是/far目录?不同实现可能有不同的答案。

一个通常的做法是由程序员指定若干头文件搜索路径(如cc的-Idir选项);同时在源代码里只包含文件名,而不包含路径。

computer/c/tips/file_inclusion.txt · 最后更改: 2014/11/01 02:02 由 127.0.0.1