Mou*_*Man 9 c preprocessor sed
我有一个非常大的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 */
Run Code Online (Sandbox Code Playgroud)
这是事情,我想摆脱那个愚蠢的标题,清理代码,并正确地缩进它.
起初,我想用一个简单的方法sed来替换所有这些宏,但似乎并不那么简单.
这种情况WHILE很成问题(其他陈述也是如此).我不能替换WHILE为juste while,因为开口的花括号将会丢失.当然,由于DO宏没有做任何事情,它并不总是出现在代码中.因此,取代DO通过{不会做的伎俩.
我也不能使用结束语,因为条件通常分为多行:
WHILE (clsr_calibragedf_tabdisque.tab_disque[indice_disque].tab_date[indice_date] NE
clsr_calibragedf_tabdate [indice].date) DO
indice ++;
ENDWHILE
Run Code Online (Sandbox Code Playgroud)
我能想到的最好的解决方案是C预处理器,它只能替换特定的宏,而不能扩展#include指令或其他宏.但我找不到那样的东西.
任何的想法?
呸!怎么样:
通过一些程序运行程序,以独特的方式perl注释掉#include指令(例如/*FIXSTUFF #include <blah.h> FIXSTUFF*/).您可能希望以#define类似的方式注释掉其他预处理器内容(例如).
检查每个文件#include的奇怪宏的定义(仅限).
现在运行gcc -E每个文件,它将预处理宏.
反向步骤1.
跑得indent很好.
注意,C预处理执行以下操作(从此处被盗):
因此,理论上您将在源代码中丢失三字符(有些人会认为这是奖励),并且可能会改变行拼接(在步骤5中固定indent).您将需要按照步骤(1)保护任何其他预处理器指示.
祝好运!