包含路径的字符串连接

String concatenation for include path

本文关键字:连接 字符串 路径 包含      更新时间:2023-10-16

是否有一种方法来连接两个字符串字面量形成一个包含路径?

代码存根:

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

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

(我确实有一个与此相关的用例,请将您的答案/评论集中在这个问题上。)

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

编译器将在#include行(每个C2011 [N1570] 6.10.2),但语义没有完全定义和不能用于连接文件路径组件,除非附加C实现的帮助。所以这一切让你Do是一些提供完整路径的简单替换,例如:

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

链接到文档。特别是本节没有给可移植解决方案留下太多希望:

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


为了完整起见,也许可以尝试使用https://stackoverflow.com/a/27830271/2436175。当我有时间的时候我会研究这个

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

#define DECORATE(x)             <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)

注意,生成的文件名包含额外的空间- <sys/ types.h>,因此它可能不是交叉编译器的解决方案。但至少对我来说,它可以在GCC 4.8/4.9的Linux主机上工作。

注:如果有人可以用其他编译器检查这个代码片段,例如MSVC.

只需避免空格和连接(##),并使用<</p>

#include <QtCore/QtGlobal>
#define QT_VERSION_PREFIX QT_VERSION_MAJOR.QT_VERSION_MINOR.QT_VERSION_PATCH
#define _CONCATE(a, c) <a/QT_VERSION_PREFIX/a/private/c>
#include _CONCATE(QtWidgets, qwidgettextcontrol_p.h)