如何摆脱可怕的无用的宏

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指令或其他宏.但我找不到那样的东西.

任何的想法?

abl*_*igh 7

呸!怎么样:

  1. 通过一些程序运行程序,以独特的方式perl注释掉#include指令(例如/*FIXSTUFF #include <blah.h> FIXSTUFF*/).您可能希望以#define类似的方式注释掉其他预处理器内容(例如).

  2. 检查每个文件#include的奇怪宏的定义(仅限).

  3. 现在运行gcc -E每个文件,它将预处理宏.

  4. 反向步骤1.

  5. 跑得indent很好.

注意,C预处理执行以下操作(从此处被盗):

  1. Trigraph替换:预处理器用它们代表的字符替换三字符序列.
  2. 线拼接:使用转义的换行序列继续的物理源线被拼接以形成逻辑线.
  3. 标记化:预处理程序将结果分解为预处理标记和空格.它用空格替换注释.
  4. 宏扩展和指令处理:执行预处理指令行,包括文件包含和条件编译.预处理器同时扩展宏,并在1999版C标准中处理_Pragma运算符.

因此,理论上您将在源代码中丢失三字符(有些人会认为这是奖励),并且可能会改变行拼接(在步骤5中固定indent).您将需要按照步骤(1)保护任何其他预处理器指示.

祝好运!