包含路径的字符串连接

有没有办法连接2个字符串文字以形成包含路径?

代码存根:

#define INCLUDE_DIR "/include" #include INCLUDE_DIR "/dummy.h" 

看看这个问题 ,答案指向不同的方向(编译器命令行)。 这里提到它似乎不可能,但我想知道这个话题是否已被挖掘得足够多。

(我确实有一个与此相关的用例,请仅关注此问题的答案/评论。)

我不确定这究竟是你想要的,但无论如何。

 #define DECORATE(x)  #define MAKE_PATH(root, file) DECORATE(root file) #define SYS_DIR(file) MAKE_PATH(sys/, file) #define ARPA_DIR(file) MAKE_PATH(arpa/, file) #include SYS_DIR(types.h) #include SYS_DIR(socket.h) #include ARPA_DIR(inet.h) 

请注意,生成的文件名包含额外的空间 – ,因此它可能不是交叉编译器解决方案。 但至少对我而言,它适用于GCC 4.8 / 4.9上的Linux主机。

PS如果有人可以用另一个编译器(例如MSVC)检查这个片段,那将是很好的。

这似乎是不可能的。 我将在这里报告Eric Postpischil回答的相关部分(他似乎不再活跃)。

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

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

链接到文档 。 特别是本节对便携式解决方案没有太多希望:

<>预处理令牌对或一对"字符"之间的预处理令牌序列组合成单个头名称预处理令牌的方法是实现定义的。


为了完整起见,可以尝试使用https://stackoverflow.com/a/27830271/2436175 。 当我有片刻时,我会调查一下......

简单地避免空间和连接(##)并使用<>它使所有更简单:

 #include  #define QT_VERSION_PREFIX QT_VERSION_MAJOR.QT_VERSION_MINOR.QT_VERSION_PATCH #define _CONCATE(a, c)  #include _CONCATE(QtWidgets, qwidgettextcontrol_p.h)