我在项目中有很多“愚蠢的”#define
,我想删除它们。不幸的是,我无法进行简单的搜索和替换,因为#define
已参数化。例如:
#define FHEADGRP( x ) bool _process_grp##x( grp_id_t , unsigned char )
这用于生成几个函数的头文件。我想以某种方式做与预处理器一样的事情 - 用结果替换宏的每次调用(插入正确的参数。我希望你理解我想做的事。
我发现使用Visual Studio,可以使用/ P选项获取预处理的中间文件。不幸的是,这对我没有帮助,因为该文件被数千个其他行“污染”并且所有#defines都已扩展。我不想这样做,我只想扩展一些宏,最好在我的IDE(即Visual Studio)中进行。有什么方法可以实现这个目标吗?
答案 0 :(得分:7)
您通常可以使用gcc -E
获取预处理器的输出(假设您当然使用gcc
,但其他编译器往往具有相同的功能)。
当然,处理该文件以自动将#define
扩展为其他文本并非易事。我可能会编写一个shell脚本(或Perl,因为在我看来,它可以更好地按摩文本)来自动完成任务。
在Visual Studio中,您可以使用/P
执行相同的操作。这可以根据this page在IDE中设置。
答案 1 :(得分:3)
是的,因为你正在使用Visual Studio。
Visual Studio IDE具有强大的搜索功能。替换机制。您似乎认为它只能处理文字字符串。它可以做得更多。按 Ctrl - Shift - H 进行全局搜索和替换。在“查找选项”中,选择“使用:通配符”。
现在将FHEADGRP(*)
替换为bool _process_grp\1( grp_id_t , unsigned char )
通配符为*
,\1
为反向引用。
[编辑]
宏在令牌化源上工作,但Search& Replace适用于字符。这可能会导致轻微问题。考虑案例FHEADGRP(Foo)
和FHEADGRP( Foo )
。对于C宏,它们是等价的,但在第二种情况下,反向引用将扩展为Foo
- 带空格。
解决方法是使用正则表达式,特别是将FHEADGRP\(:b*(.*):b*\)
替换为bool _process_grp\0( grp_id_t , unsigned char )
。我发现VS2005的实现有点儿麻烦;例如,简单?
表达式无法匹配单个空格。但上面的例子应该可行。
答案 2 :(得分:0)
呃我建议你使用sed,http://www.gnu.org/software/sed/或其他正则表达式工具。