我有一个非常大的C和C ++代码(~200k loc),它大量使用了糟糕的宏:
/* ... */
#define PRIVATE static
#define BEGIN {
#define END }
/* ... */
#define WHILE(e) while (e) {
#define DO /* yep, it's empty */
#define ENDWHILE }
/* and it goes on and on, for every keyword of the language */
这是事情,我想摆脱那个愚蠢的标题,清理代码,并正确缩进。
起初,我想用一个简单的sed
替换所有这些宏,但似乎并不那么简单。
WHILE
的情况很成问题(其他语句也是如此)。我无法通过WHILE
来替换while
,因为缺少开头的大括号。当然,由于DO
宏没有做任何事情,它并不总是出现在代码中。因此,将DO
替换为{
将无法解决问题。
我也不能使用结束语,因为条件通常被分成多行:
WHILE (clsr_calibragedf_tabdisque.tab_disque[indice_disque].tab_date[indice_date] NE
clsr_calibragedf_tabdate [indice].date) DO
indice ++;
ENDWHILE
我能想到的最佳解决方案是C预处理器,它只能替换特定的宏,而不能扩展#include
指令或其他宏。但我找不到那样的东西。
有什么想法吗?
答案 0 :(得分:7)
呸!怎么样:
通过一些perl
运行您的程序,以独特的方式注释#include
指令(例如/*FIXSTUFF #include <blah.h> FIXSTUFF*/
)。您可能希望以类似的方式注释掉其他预处理器内容(例如#define
)。
检查每个文件#include
的奇怪宏的定义(仅限)。
现在在每个文件上运行gcc -E
,这将预处理宏。
反向步骤1.
运行indent
以获得良好的衡量标准。
注意,C预处理执行以下操作(从here中窃取):
因此,理论上您将在源代码中丢失三字符(有些人会建议这是一个奖励),并可能改变行拼接(在步骤5中使用indent
修复)。您将需要按照步骤(1)保护任何其他预处理器指示。
答案 1 :(得分:0)
Eclipse IDE有一些很棒的搜索和替换工具。您可以在那里导入代码,然后使用文件搜索工具。您可以像这样使用它:
使用Ctrl + H
(或上下文菜单中的Search > File...
)将其打开以搜索您的某个宏的所有出现
点击Replace...
打开替换窗口,可以选择替换
点击Preview >
查看所有替换内容并将其应用于OK
对于更复杂的情况,您可以在文件搜索视图中使用正则表达式标记。例如,以下是如何将其应用于WHILE-ENDWHILE-macro:
搜索正则表达式(请参阅反向查找,了解其工作原理):
WHILE(((?!ENDWHILE).|\s)+)ENDWHILE
插入替换while(\1)