包含路径的预处理器连接

Tob*_*oby 2 c include c-preprocessor

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

#include "../../Path/to/my/file.h"
Run Code Online (Sandbox Code Playgroud)

在我有多个这样的地方它变得有点不方便所以我想我可以对目录路径使用#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
Run Code Online (Sandbox Code Playgroud)

然而,这不起作用......无论如何在适合于此的C预处理器的工作中进行连接?

Eri*_*hil 5

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

#define MyPath "../../path/to/my/file.h"
#include MyPath
Run Code Online (Sandbox Code Playgroud)

大多数编译器和操作系统可以做的是:

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