如何生成所有出现的宏的列表?

How to generate a list of all occurances of a macro?

我有一些用 COMPONENT 宏标记的 struct 声明。我想根据这些声明构建一个类型列表。鉴于此代码:

// a.hpp

COMPONENT(A) {
  // struct body
};

// bc.hpp

COMPONENT(B) {
  // struct body
};
COMPONENT(C) {
  // struct body
};

我想生成一个如下所示的元组:

constexpr auto components = std::make_tuple(
  Comp<A>{“A”},
  Comp<B>{“B”},
  Comp<C>{“C”}
);

元组中元素的顺序无关紧要。我还必须手动包含所有包含 COMPONENT 声明的 headers。

我可以编写一个 Python 脚本在构建时生成文件,但如果可能的话我想用预处理器来完成。我不认为这是可能的,但我看到人们用预处理器做了一些疯狂的事情,所以我想我会问。我不懂宏元编程,也不懂模板元编程。

您不能使用 C 预处理器本身执行此操作。它非常有限,并且不支持成熟的脚本语言 - 远非如此。

您的两个行动方案是:

  1. 使用编译器的前端获取预处理语法树(clang 可能会让你这样做;不太确定 GCC)
  2. 使用 Python/Perl/bash/awk/sed 脚本查找宏的用途。

选项 1 需要更多的努力(除非您可以采用另一个现有工具),但准确;选项 2 需要很少的努力,但如果没有 "reinventing the wheel" 则相当不准确 - 具有误报(例如字符串中的宏名称)并且可能还有误报(例如在宏中应用的宏,当其名称通过连接标识符生成时) .