包含路径的预处理器并置

时间:2013-12-11 16:24:31

标签: c include c-preprocessor

我有一组包含在远离目录中的包含,这意味着包含它们需要长包含,例如:

#include "../../Path/to/my/file.h"

如果我有多个这样的话会变得有点不方便,所以我想我可以使用#define作为目录路径,然后连接我需要的文件名,即

#define DIR "../../Path/to/my/"
#define FILE1 "file.h"
#define FILE2 "anotherFile.h"

#include DIR FILE1 // should end up same as line in first example after pre-proc

然而这不起作用...无论如何要在C预处​​理器的工作中连接适合这个吗?

2 个答案:

答案 0 :(得分:4)

您无法自定义此类包含文件的搜索路径,但您可以告诉编译器在哪里查找包含文件。许多编译器-I选项,例如:

gcc -c stuff.c -I/path/to/my/ -I/path/to/other/

如果这使得编译命令太长,您应该编写一个Makefile,或者,如果您在Visual Studio或类似的IDE中工作,则在项目设置中自定义搜索路径。

答案 1 :(得分:3)

编译器将在#include行(每C 2011 [N1570] 6.10.2 4)进行宏替换,但语义没有完全定义,并且在没有C实现的额外帮助的情况下不能用于连接文件路径组件。因此,所有这些允许您做的是提供完整路径的一些简单替换,例如:

#define MyPath "../../path/to/my/file.h"
#include MyPath

您可以对大多数编译器和操作系统执行的操作是:

  • 告诉编译器搜索包含文件的目录(与GCC的-I开关一样)。
  • 创建指向其他目录的符号链接,以便#include "FancyStuff/file.h"等同于../../path/to/FancyStuff,因为有一个名为FancyStuff的符号链接指向更长的路径。