2016-08-19 124 views
11

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

代码存根:

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

综观this question,答案在不同的方向(编译器命令行)点。这是here提到,它似乎是不可能的,但我想知道这个话题是否足够挖掘。

(我有一个用例中,这是相关的,请只专注于这个问题的答案/评论。)

+0

您是否在寻找一个解决方案对于特定的编译器还是需要交叉编译器解决方案? (国际海事组织最好将其添加到问题中) – mvidelgauz

+0

Tjhere在现代C++中没有这种能力。 –

+0

@mvidelgauz我使用gcc/llvm。我不会添加标签,但我会说,编译器特定的解决方案通常与此相关。 – Antonio

回答

0

看来这真的不可能。我将在这里报告Eric Postpischil's answer的相关部分(他似乎不再活跃)。

编译器将做上#include线宏替换(的每个C 2011 [N1570] 6.10.2 4),但语义尚未完全确定, 不能用来连接而无需额外 文件路径部件来自C实施的帮助。所以,这一切让你 做的是一些简单的替换,提供了一个完整路径,如:

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

Link to documentation。特别地,这部分不会留下多少希望用于便携式解决方案:

,通过该预处理标记对或一对"字符 一个<>之间预处理标记的序列被组合成的方法单头名称预处理令牌为实现定义的 。


为了完整起见,或许真的可以用https://stackoverflow.com/a/27830271/2436175尝试。我会调查,当我有时间...

0

我不知道,这正是你想要什么,但无论如何。

#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主机。

P.S.如果有人可以用另一个编译器检查这个片段,这将是很好的,例如, MSVC。

+0

@AlterMann真的很奇怪的行为,因为它构建专有名称并扩展标题,而不管错误消息如何。 – Sergio

+0

你有编译器可以工作吗?我同意人们会希望它这样做...... – Antonio

+0

@Antonio我已经删除了###连接,现在它可以工作,但有一个警告,请参阅我的编辑。 – Sergio

0

简单地避免了空间和级联(##),并使用<>它使所有simplier:

#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) 
+0

'_CONCATE'?!?!? – Antonio