有没有一种方法可以“扩展”#define指令?

3

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

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

这是用于生成一些函数的头文件。我想以某种方式做与预处理器相同的事情 - 将每个宏调用替换为其结果(插入正确的参数)。希望你明白我的意思。
我发现在Visual Studio中,可以通过选项/P获取预处理的中间文件。不幸的是,这对我没有帮助,因为该文件被"污染"了成千上万行,并且所有#defines都被展开了。我不想这样做,我只想扩展一些宏,并最好在我的IDE(即Visual Studio)中完成。有什么方法可以实现这个吗?
3个回答

7
您通常可以使用gcc -E获取预处理器的输出(假设您正在使用gcc,尽管其他编译器往往具有相同的功能)。
当然,将该文件处理为自动扩展#define到其他文本并不是一项微不足道的任务。我可能会编写一个shell脚本(或者Perl,因为我认为它更擅长处理文本)来自动化该任务。
在Visual Studio中,您可以使用/P执行相同的操作。这可以根据此页面中的说明在IDE中设置。

谢谢你的回答。由于我使用的是Visual Studio(在标签中已经说明了,但我忘记在问题中提到),所以这并没有太大帮助。你知道如何在这个集成开发环境中简便地完成这个任务吗?或者我只能选择使用Perl呢?(虽然这是一个好主意,但代码量会更多一些...) - PeterK
请参考 https://dev59.com/z3VC5IYBdhLWcg3wfhKL 了解如何在Visual Studio中进行预处理。 - nos
已经找到了,但想要一个更简洁的方法(只扩展一个宏...)。无论如何,感谢回答,我可能会选择 Perl ;) - PeterK
您还可以使用diff程序将预处理器输出与源文件进行比较。每个#define扩展都非常明显,使编辑更加容易。 - doug

3

是的,有 - 因为您正在使用Visual Studio。

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

现在将FHEADGRP(*)替换为bool _process_grp\1( grp_id_t , unsigned char )

通配符是*\1是反向引用。

[编辑] 宏适用于标记化源代码,但搜索和替换是基于字符的。这可能会导致轻微的问题。考虑FHEADGRP(Foo)FHEADGRP( Foo )两种情况。对于C宏来说,它们是等效的,但在第二种情况下,反向引用将扩展为带有空格的Foo

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


谢谢!看来我还没有充分探索这个功能。谢谢你,这比我自己编写perl脚本要好得多! - PeterK

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接