如何在预处理器时附加到 __FILE__ 并包含结果

Posted

技术标签:

【中文标题】如何在预处理器时附加到 __FILE__ 并包含结果【英文标题】:how to append to __FILE__ at preprocessor time and include the result 【发布时间】:2017-08-23 15:08:54 【问题描述】:

我想包含来自component.hcomponent.h.gen

我已经看到我可以将__FILE__#include 一起使用,如果没有标头保护,则会导致递归包含。

有没有办法附加一个 C 字符串文字并包含结果?这是我迄今为止尝试过的:

#define CAT_IMPL(s1, s2) s1##s2
#define CAT(s1, s2) CAT_IMPL(s1, s2)
#define DO_IT CAT(__FILE__, ".gen")

#include DO_IT

但这会导致与包含自身在内的文件进行相同的递归 - 未使用 ".gen" 部分 - 我在 MSVC 中收到此警告:

警告 C4067:预处理器指令后出现意外标记 - 需要换行符

是否有适用于 gcc/clang/msvc 的解决方案?

请注意,我计划在数百个甚至数千个文件中使用它,并且我想通过复制粘贴相同的代码来简化我的生活 - 这就是我试图让它工作的原因。

【问题讨论】:

downvoters - 请解释... 【参考方案1】:

很遗憾,这是不可能的:

__FILE__ 展开为字符串;你不能取消字符串。因此,仅添加字符串的“其余部分”,然后对结果进行字符串化的技术是不可用的。 粘贴两个字符串标记不会创建有效标记。因此无法粘贴。 预处理器不存在字符串文字连接(预处理器是翻译阶段 4;字符串文字连接是阶段 6)。

【讨论】:

太遗憾了,我不能在头文件和源文件上附加定义(但它是有道理的......) - 否则我可以用我的构建系统模拟这个...... 你的构建系统是开放式的......你可以简单地使用另一个工具来生成包含文件。【参考方案2】:

有点晦涩,但似乎可以使用 gcc。

看这个问题的第二个答案:

C Macro - Dynamic #include

【讨论】:

这个问题不相关,因为您无法取消__FILE__ 的字符串化。

以上是关于如何在预处理器时附加到 __FILE__ 并包含结果的主要内容,如果未能解决你的问题,请参考以下文章

在bash中将文本附加到具有模式匹配名称的文件[重复]

如何解释 D3 附加到 DOM 元素的 __transition__ 属性作为过渡的一部分?

北京地铁_结对项目_附加题

如何将数据附加到 YAML 文件

?dirname(__FILE__)

如何找到父函数的__FUNCTION__、__LINE__和__FILE__?