【问题标题】:how to append to __FILE__ at preprocessor time and include the result如何在预处理器时附加到 __FILE__ 并包含结果
【发布时间】: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 - 请解释...

标签: c++ c-preprocessor


【解决方案1】:

很遗憾,这是不可能的:

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

【讨论】:

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

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

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

C Macro - Dynamic #include

【讨论】:

  • 这个问题不相关,因为您无法取消__FILE__ 的字符串化。
猜你喜欢
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 2017-08-09
  • 1970-01-01
  • 2021-05-16
相关资源
最近更新 更多