C++ 有没有办法';展开';#define指令?

C++ 有没有办法';展开';#define指令?,c++,visual-studio,macros,c-preprocessor,C++,Visual Studio,Macros,C Preprocessor,我在一个项目中有很多“愚蠢的”#define,我想删除它们。不幸的是,我无法进行简单的搜索和替换,因为#define是参数化的。例如: #define FHEADGRP( x ) bool _process_grp##x( grp_id_t , unsigned char ) 这用于生成两个函数的标题。我想以某种方式做与预处理器相同的事情——用宏的结果(插入正确的参数)替换宏的每个调用。我希望您理解我要做的事情 我发现,使用Visual Studio,可以使用/p选项获得预处理的中间文件。不幸

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

#define FHEADGRP( x ) bool _process_grp##x( grp_id_t , unsigned char )
这用于生成两个函数的标题。我想以某种方式做与预处理器相同的事情——用宏的结果(插入正确的参数)替换宏的每个调用。我希望您理解我要做的事情


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

您通常可以使用
gcc-E
获得预处理器的输出(当然,假设您使用的是
gcc
,尽管其他编译器往往具有相同的功能)

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



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

嗯,我建议您使用sed或其他正则表达式工具。

是的,因为您使用的是Visual Studio

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

现在将
FHEADGRP(*)
替换为
bool\u process\u grp\1(grp\u id\u t,unsigned char)

通配符是
*
,而
\1
是反向引用

[编辑] 宏在标记的源上工作,但是搜索和替换在字符上工作。这会引起一个小问题。考虑案例<代码> fHeGRP(FoO)< /C>和<代码> fHeDGRP(FoO)< /Calp>。对于C宏,它们是等价的,但在第二种情况下,后备引用将扩展到<代码> FoO -空格。


解决方法是使用正则表达式,特别是将
FHEADGRP\(:b*(.*):b*\)
替换为
bool\u进程\u grp\0(grp\u id\u t,unsigned char)
。我发现VS2005实现有点缺陷;例如,简单的
表达式无法匹配单个空格。但是上面的示例应该可以运行。

感谢您的回答。因为我使用的是visual studio(标签中有说明,但我忘了在问题中提及)这没有多大帮助。你知道一个简单的方法如何使用这个IDE吗?或者我将不得不使用Perl?(这是一个好主意,但涉及到更多的编码…)请参阅如何使用visual Studio完成它已经发现了这一点,但正在寻找一种更干净的方法(仅扩展一个宏…)。无论如何,感谢您的回答,我可能会选择perl;)您还可以使用diff程序将预处理器输出与源文件进行比较。每个#define扩展都非常明显,使编辑更容易。谢谢!我似乎对这一功能的研究还不够深入。谢谢,这比编写我自己的perl脚本要好得多!