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

时间:2019-04-06 21:38:54

标签: c++ c-preprocessor

我有一些struct声明,它们带有一个COMPONENT宏。我想从这些声明中建立一个类型列表。给出以下代码:

// 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脚本来在构建时生成文件,但是如果可能的话,我希望使用预处理器来执行此操作。我认为这是不可能的,但是我已经看到人们用预处理器做一些疯狂的事情,所以我想问一下。我不了解宏元编程,也不了解模板元编程。

1 个答案:

答案 0 :(得分:0)

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

您的两个行动方针是:

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

选项1的工作量要多得多(除非您可以改编另一个现有工具),但是要准确;选项2所需的精力很少,但是如果没有“重新发明轮子”,就会非常不准确-带有假肯定(例如,字符串中的宏名称),还可能带有假否定(例如,当宏的名称是通过连接标识符生成时,在宏中应用的宏)