从源中提取预处理器符号

时间:2016-03-23 14:04:44

标签: c++ c c-preprocessor

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

#ifdef FOO
#endif

#if ( BAR == 1 && \
      defined (Z) )
#endif

我想将列表[FOO,BAR,Z]作为输出。

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

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

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

现在更认真。正如您可以要求预处理器为您提供所有已定义符号的列表,您只需标记化源,并从该列表中标识所有未紧跟在初始#define之后的标记或#民主基金。对于lex + yacc,这一部分应该是合理可行的。

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

TL / DR:不管你接受了,这将是一项艰苦的工作:如果你能做到,那就远离那个......

答案 1 :(得分:0)

通过使用预处理器库(例如Boost.Wave)可以获得一半。它可以充当词法分析器,因此您不必自己编写该部分。你必须提供你关心的位语法(define,ifdef,ifndef,if,elif)。