如何在预处理器时附加到 __FILE__ 并包含结果
Posted
技术标签:
【中文标题】如何在预处理器时附加到 __FILE__ 并包含结果【英文标题】:how to append to __FILE__ at preprocessor time and include the result 【发布时间】:2017-08-23 15:08:54 【问题描述】:我想包含来自component.h
的component.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__ 并包含结果的主要内容,如果未能解决你的问题,请参考以下文章