如何生成所有出现的宏的列表?
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 预处理器本身执行此操作。它非常有限,并且不支持成熟的脚本语言 - 远非如此。
您的两个行动方案是:
- 使用编译器的前端获取预处理语法树(clang 可能会让你这样做;不太确定 GCC)
- 使用 Python/Perl/bash/awk/sed 脚本查找宏的用途。
选项 1 需要更多的努力(除非您可以采用另一个现有工具),但准确;选项 2 需要很少的努力,但如果没有 "reinventing the wheel" 则相当不准确 - 具有误报(例如字符串中的宏名称)并且可能还有误报(例如在宏中应用的宏,当其名称通过连接标识符生成时) .
我有一些用 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 预处理器本身执行此操作。它非常有限,并且不支持成熟的脚本语言 - 远非如此。
您的两个行动方案是:
- 使用编译器的前端获取预处理语法树(clang 可能会让你这样做;不太确定 GCC)
- 使用 Python/Perl/bash/awk/sed 脚本查找宏的用途。
选项 1 需要更多的努力(除非您可以采用另一个现有工具),但准确;选项 2 需要很少的努力,但如果没有 "reinventing the wheel" 则相当不准确 - 具有误报(例如字符串中的宏名称)并且可能还有误报(例如在宏中应用的宏,当其名称通过连接标识符生成时) .