【问题标题】:String concatenation for include path包含路径的字符串连接
【发布时间】:2016-12-26 14:30:30
【问题描述】:

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

代码存根:

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

查看this question,答案指向不同的方向(编译器命令行)。提到here貌似不可能,不过不知道是不是已经挖够了话题。

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

【问题讨论】:

  • 您是在寻找特定编译器的解决方案还是需要交叉编译器解决方案? (IMO 最好将其添加到问题中)
  • 现代 C++ 中没有这种能力。
  • @mvidelgauz 我使用 gcc/llvm。不过我不会添加标签,我想说的是,编译器特定的解决方案在这里通常是相关的。
  • 编译器命令行绝对是这里的必经之路。此配置属于 Makefile(或类似文件),而不是代码文件。
  • @KonradRudolph 我的用例如下。我有一个大项目,它使用 cmake 来生成 makefiles/ninja.rules。在这个大项目中,为了简洁起见,所有包含路径都是共享的。但是,根据相同的 cmake 选项,可能会排除或不排除包含路径仅与少数文件相关。如果我更改其中一个 cmake 选项,则所有文件的包含路径都会更改,因此需要重新编译所有文件。我解决这个问题的方法是,cmake 生成一个包含头文件的完整路径 的配置文件,并且仅在需要该头文件的地方包含这个生成的文件。

标签: c++ c include c-preprocessor


【解决方案1】:

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

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

请注意,生成的文件名包含额外的空格 - &lt;sys/ types.h&gt;,因此它可能不是交叉编译器解决方案。但至少对我来说,它适用于 GCC 4.8 / 4.9 上的 Linux 主机。

附:如果有人可以用另一个编译器检查这个 sn-p,那就太好了,例如MSVC。

【讨论】:

  • @AlterMann 非常奇怪的行为,因为它构建了正确的名称并扩展了标题,而不管错误消息。
  • 您有可以使用的编译器吗?我同意人们会期望它这样做......
  • @Antonio 我已经删除了## 连接,现在它可以工作了,但有一个警告,请参阅我的编辑。
  • 要删除空间,concatenation 可以提供帮助。
  • @SimpleGuy 这就是这篇文章的重点,它不适用于包含路径
【解决方案2】:

看来这确实是不可能的。我会在这里报告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。特别是本节对便携式解决方案没有太大希望:

一系列预处理标记之间的方法 一个&lt; 和一个&gt; 预处理令牌对或一对" 字符 被组合成一个单独的标头名称预处理标记是 实现定义。


为了完整起见,也许可以使用https://stackoverflow.com/a/27830271/2436175 进行尝试。有空我会调查一下……

【讨论】:

    【解决方案3】:

    简单地避免空格和连接 (##) 并使用 它使一切变得更简单:

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

    【讨论】:

    • _CONCATE?!?!?
    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2014-10-29
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多