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

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

本文关键字:列表 何生成      更新时间:2023-10-16

我有一些用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声明的所有标头。

我可以编写一个在构建时生成文件的 Python 脚本,但如果可能的话,我想使用预处理器执行此操作。我认为这是不可能的,但我见过人们用预处理器做一些疯狂的事情,所以我想我会问。我不了解宏元编程,就像我了解模板元编程一样。

你不能用 C 预处理器本身来做到这一点。它非常有限,并且不支持成熟的脚本语言 - 不是很远。

您的两个行动方案是:

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

1 要努力得多(除非你可以适应另一个现有的工具(,但很准确;选项 2 需要很少的努力,但如果不"重新发明轮子",这是非常不准确的 - 有误报(例如字符串中的宏名称(,也可能有漏报(例如,在宏中应用的宏,当它的名称是通过连接标识符生成的(。