包含路径

时间:2016-08-19 12:16:33

标签: c++ c include c-preprocessor

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

代码存根:

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

查看this question,答案指向不同的方向(编译器命令行)。提到here它似乎是不可能的,但我想知道这个话题是否已被挖掘出来。

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

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

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

  

编译器将在#include行(每个C)进行宏替换   2011 [N1570] 6.10.2 4),但语义没有完全定义和   不能在没有附加的情况下连接文件路径组件   来自C实施的帮助。所以这一切都可以让你   do是一些提供完整路径的简单替换,例如:

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

Link to documentation。特别是本节对便携式解决方案没有太多希望:

  

一系列预处理令牌之间的方法   一个<和一个>预处理令牌对或一对"个字符   被合并为单个头名称预处理令牌   实现定义的。

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

答案 2 :(得分:0)

简单地避开空格和连接(##)并使用&lt; &GT;它简化了一切:

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