有没有办法'扩展'#define指令?

时间:2010-06-21 07:11:37

标签: c++ visual-studio macros c-preprocessor

我在项目中有很多“愚蠢的”#define,我想删除它们。不幸的是,我无法进行简单的搜索和替换,因为#define已参数化。例如:

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

这用于生成几个函数的头文件。我想以某种方式做与预处理器一样的事情 - 用结果替换宏的每次调用(插入正确的参数。我希望你理解我想做的事。

我发现使用Visual Studio,可以使用/ P选项获取预处理的中间文件。不幸的是,这对我没有帮助,因为该文件被数千个其他行“污染”并且所有#defines都已扩展。我不想这样做,我只想扩展一些宏,最好在我的IDE(即Visual Studio)中进行。有什么方法可以实现这个目标吗?

3 个答案:

答案 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/或其他正则表达式工具。