C++ 包含路径的字符串连接

C++ 包含路径的字符串连接,c++,c,include,c-preprocessor,C++,C,Include,C Preprocessor,有没有一种方法可以连接两个字符串和文本以形成包含路径 代码存根: #define INCLUDE_DIR "/include" #include INCLUDE_DIR "/dummy.h" 看,答案指向不同的方向(编译器命令行)。有人提到这似乎是不可能的,但我想知道这个话题是否已经挖掘得足够了 (我确实有一个与此相关的用例,请仅将您的答案/评论集中在这个问题上。)我不确定这是否正是您想要的,但无论如何 #define DECORATE(x) <x> #de

有没有一种方法可以连接两个字符串和文本以形成包含路径

代码存根:

#define INCLUDE_DIR "/include"
#include INCLUDE_DIR "/dummy.h"
看,答案指向不同的方向(编译器命令行)。有人提到这似乎是不可能的,但我想知道这个话题是否已经挖掘得足够了


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

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

#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)
#定义装饰(x)
#定义MAKE_路径(根,文件)装饰(根文件)
#定义系统目录(文件)生成路径(系统/文件)
#定义ARPA_目录(文件)生成路径(ARPA/,文件)
#包括系统目录(类型.h)
#包括系统目录(socket.h)
#包括ARPA_目录(inet.h)
请注意,生成的文件名包含额外的空间-
,因此它可能不是跨编译器解决方案。但至少对我来说,它可以在GCC4.8/4.9的Linux主机上运行


另外,如果有人能与其他编译器(如MSVC)一起检查这段代码,那就太好了。

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

编译器将在
#include
行上执行宏替换(按照C 2011[N1570]6.10.2 4),但语义尚未完全定义和定义 无法用于连接文件路径组件,而无需附加 C执行部门的协助。所以这一切让你 do是提供完整路径的一些简单替换,例如:

#define MyPath "../../path/to/my/file.h"
#include MyPath
。特别是,本节并没有给便携式解决方案留下太多希望:

一种方法,通过该方法可以在 一个
预处理令牌对或一对
字符 合并为单个标头名称预处理令牌是 实现定义



为了完整性,也许可以尝试使用一些东西。我会调查一下,当我有时间的时候…

只需避免空格和连接(##)并使用<>它会使一切变得更简单:

#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)
#包括
#定义QT\u版本\u前缀QT\u版本\u主要.QT\u版本\u次要.QT\u版本\u补丁
#定义_CONCATE(a,c)
#包括_CONCATE(QtWidgets、qwidgettextcontrol\u p.h)

您是在寻找针对特定编译器的解决方案,还是需要交叉编译器解决方案?(在我看来,最好将其添加到问题中)TJSITE在现代C++中没有这样的能力。@ MVIDeluz我使用GCC/LLVM。但是我不会添加标签,编译器特定的解决方案在这里一般都是相关的。编译器命令行绝对是到这里的方式。这个配置属于MaFIX文件(或类似的)。,不在代码文件中。@KonradRudolph我的用例如下。我有一个大项目,它使用cmake生成makefiles/ninja.rules。在这个大项目中,对于semplicity,所有包含路径都是共享的。但是,根据相同的cmake选项,可能会排除或不排除与几个文件相关的包含路径。如果我更改其中一个在cmake选项中,所有文件的包含路径都会更改,因此所有文件都需要重新编译。我解决这个问题的方法是,cmake生成一个配置文件,其中包含头的完整路径,并且只在需要头的地方包含生成的文件。@AlterMann的行为非常奇怪,因为它会生成正确的名称并扩展headers不考虑错误消息。你有一个可以使用的编译器吗?我同意有人会期望它这样做…@Antonio我已经删除了
##
连接,现在它可以工作了,但是有一个警告,请参阅我的编辑。要删除空间,可以帮助你。@SimpleGuy这是本文的重点,它不适用于包含路径
\u CONCATE?!?!?