2010-06-21 168 views
3

我在项目中有很多“笨”#define,我想删除它们。不幸的是,我不能做一个简单的搜索和替换,因为#define被参数化。例如:有没有办法'扩展'#define指令?

#define FHEADGRP(x) bool _process_grp##x(grp_id_t , unsigned char) 

这是用来生成几个函数的标题。我想以某种方式执行与预处理器相同的操作 - 根据其结果替换宏的每个调用(插入正确的参数)。我希望你明白我想做什么。

我发现使用Visual Studio ,可以使用/ P选项获得预处理的中间文件,但不幸的是,这并不能帮助我,因为文件被数千行其他行“污染”,并且所有的#define都被扩展了,我不想这样做,我只是想扩展一些宏,最好是在我的IDE(这是Visual Studio)中做到这一点。有没有办法如何实现这一点?

回答

3

是的,有 - 因为你使用Visual Studio。

Visual Studio IDE有一个强大的搜索&替换机制。你似乎认为它只能处理文字字符串。它可以做更多。点击Ctrl - Shift - H用于全局搜索和替换。在“查找选项”中,选择“使用:通配符”。

现在,通过bool _process_grp\1(grp_id_t , unsigned char)

通配符为*,并\1是反向引用替换FHEADGRP(*)

宏在标记源上工作,但搜索&替换字符。这可能会导致一个小问题。考虑案例FHEADGRP(Foo)FHEADGRP(Foo)。对于C宏,它们是等效的,但在第二种情况下,反向引用将扩展到Foo - 带有空格。

解决方法是使用正则表达式,特别是用bool _process_grp\0(grp_id_t , unsigned char)替换FHEADGRP\(:b*(.*):b*\)。我发现VS2005的实现有点bug。例如简单的?表达式无法匹配单个空间。但上面的例子应该可以工作。

+0

谢谢!我真的没有足够的探索这个功能。谢谢,这比写我自己的Perl脚本要好得多! – PeterK 2010-06-21 12:15:02

7

你通常可以得到预处理器的输出与gcc -E(假设你'当然,使用gcc,虽然其他编译器te找到相同的功能)。

当然,处理该文件以自动将#define的文件扩展为其他文本并不是一项简单的任务。我可能会编写一个shell脚本(或者Perl,因为在我看来,它更好地处理文本)来自动执行任务。


在Visual Studio中,您可以使用/P执行相同的操作。这可以在IDE中根据this page进行设置。

+0

谢谢你的回答。由于我使用的是视觉工作室(在标签中说过,但我忘了在提问中提到),这并没有多大帮助。你知道一个简单的方法如何使用这个IDE做到这一点?或者我将不得不使用Perl? (这是一个不错的主意,但涉及更多的编码......) – PeterK 2010-06-21 07:50:57

+0

请参阅http://stackoverflow.com/questions/277258/cc-source-file-after-preprocessing了解如何使用visual studio执行此操作 – nos 2010-06-21 07:58:43

+0

已经发现,但正在寻找更清晰的方式(只扩展一个宏...)。无论如何,感谢您的答案,我可能会去perl;) – PeterK 2010-06-21 08:04:14

相关问题