我正在寻找一种方法来提取我的代码中使用的所有预处理器符号 例如,如果我的代码如下所示:
#ifdef FOO
#endif
#if ( BAR == 1 && \
defined (Z) )
#endif
我想将列表[FOO,BAR,Z]
作为输出。
我发现了一些建议gcc -E -dM
的帖子,但这会显示预处理器将应用于代码的所有符号。
相反,我想要的是代码中实际使用的所有符号的列表。
有什么建议吗?
答案 0 :(得分:2)
这非常简单。您只需按照符合预处理器的方式解析源代码完全,并使用正确的C或C ++版本支持。好吧,我开玩笑说,如果你只支持更高版本,你的代码可能会在旧版本上产生正确的结果 - 但即使这样也应该彻底控制。
现在更认真。正如您可以要求预处理器为您提供所有已定义符号的列表,您只需标记化源,并从该列表中标识所有未紧跟在初始#define之后的标记或#民主基金。对于lex + yacc,这一部分应该是合理可行的。
我能想象的唯一选择是使用真实编译器的代码(Clang应该比gcc更容易但不确定)丢弃所有代码生成并始终存储每个宏用法。
TL / DR:不管你接受了,这将是一项艰苦的工作:如果你能做到,那就远离那个......答案 1 :(得分:0)
通过使用预处理器库(例如Boost.Wave)可以获得一半。它可以充当词法分析器,因此您不必自己编写该部分。你必须提供你关心的位语法(define,ifdef,ifndef,if,elif)。