【问题标题】:C Header File: Macro Expansion without Std LibraryC 头文件:没有标准库的宏扩展
【发布时间】:2021-05-28 00:32:20
【问题描述】:

我正在寻找扩展我在 c 头文件中的宏,但到目前为止我还获得了一个标准库。我的 ~200 行文件扩展为 60k 行文件(其中 ~30k 行是空白),其中我只想使用扩展后的原始 ~200 行。

有没有允许我不扩展标准库的标志?

目前使用的命令:cl myHeader.h /E > __test.h

扩展到我处理的标头中的行引用示例(省略扩展代码): #line 688 "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Professional\\VC\\Tools\\MSVC\\14.16.27023\\include\\string"

我的最终用例是解析扩展的标头,我相信(但不能确定)大多数宏都是简单的 #define FOO 42 类型扩展,用于填充数组大小。如果我无法让cl 停止插入标准库,我还有其他选择吗?

在最坏的情况下,我可以从底部向上工作并将文件剪辑到 #line <num> <path> 与我的文件路径不匹配,但这似乎很不雅。

在 Windows 上使用 MSVC。

【问题讨论】:

  • A) 向我们展示您正在谈论的文件或重现问题的最小版本。 B) 除非您 #include 某些东西,否则您通常不会得到扩展,在这种情况下,您显然会有更多的行。
  • 您是否尝试提供与标准库同名的空头文件并更改包含搜索路径列表?这听起来像是一个 hack,但你想要它,它只会用于此目的。要分离这些头文件,您应该将它们放在一个自己的目录中。
  • 仅出于预处理目的,您可以简单地注释掉包含的库。或者至少这适用于许多其他编译器,不确定 MSVC。
  • @Lundin 你是对的,根本原因是#include <string>。我没有想过取消它,认为它会导致错误。 (文件中的一个函数是使用std::string)。预处理器似乎根本不介意。谢谢,您应该/应该将其设置为答案而不是评论。

标签: c c-preprocessor


【解决方案1】:

感谢上述 cmets 中的@Lundin。

我错误地认为注释掉编译所需的包含会阻碍预处理器。它一点也不在乎。剥离麻烦的#includes 是获取宏扩展标头的一种非常简单的方法。它仍然会有#line <number> <path> 和空白行,但是这些都可以去掉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2013-08-08
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多