从源中提取预处理器符号

Mic*_*ler 13 c c++ c-preprocessor

我正在寻找一种方法来提取我的代码中使用的所有预处理器符号.
例如,如果我的代码如下所示:

#ifdef FOO
#endif

#if ( BAR == 1 && \
      defined (Z) )
#endif
Run Code Online (Sandbox Code Playgroud)

我想把列表[FOO,BAR,Z]作为输出.

我发现了一些帖子gcc -E -dM,但这会显示预处理器将应用于代码的所有符号.
相反,我想要的是代码中实际使用的所有符号的列表.

有什么建议?

Ser*_*sta 2

这很简单。您只需按照一致的预处理器的方式完全解析源代码,并具有正确的 C 或 C++ 版本支持。好吧,我是在开玩笑,如果您只支持更高版本,您的代码可能会在旧版本上产生正确的结果 - 但即使这样也应该得到彻底控制。

现在更严重了。由于您可以要求预处理器提供所有已定义符号的列表,因此您可以简单地对源进行标记,并识别该列表中不紧随初始 #define 或 #undef 的所有标记。这部分应该可以通过 lex+yacc 合理实现。

我能想到的唯一选择是使用真正的编译器的代码(Clang 应该比 gcc 更容易,但不确定)丢弃所有代码生成并一致存储每个宏用法。

TL/DR:无论你采取什么方式,这都将是一项艰苦的工作:如果你可以不这样做,那就远离它......