C言語ソースのifdefを削除するツール

題名の内容をググったら下記の記事を見つけた。
cpp-tools - Cソース中の大量のifdefを読みやすくしたい(ツール探索編) - spikelet days

記事中のツールで手に入るものはunifdefのみっぽい。

unifdefを下記から入手
unifdef - selectively remove C preprocessor conditionals

上記の記事とはバージョンが違うので、再確認

結果としては、このツールで問題ない。
上記の記事で問題とされた内容は新しいバージョンでは対応されている。


例5,6以外は下記を実行

unifdef -DA -UB ファイル名

例1

#ifdef A
"A is defined"; A;
#else
"A is not defined";
#endif
"Finished.";

結果

"A is defined"; A;
"Finished.";


例2

#ifdef A
"A is defined"; A;
#ifdef B
"B is defined"; B;
#else
"B is not defined";
#endif
#else
"A is not defined";
#endif
"Finished.";

結果

"A is defined"; A;
"B is not defined";
"Finished.";

例3

#if defined(A)
"A is defined"; A;
#else
"A is not defined";
#endif
"Finished.";

結果

#if defined(A)
"A is defined"; A;
#else
"A is not defined";
#endif
"Finished.";

例4

#if defined(A)
"A is defined"; A;
#if defined(B)
"B is defined"; B;
#else
"B is not defined";
#endif
#else
"A is not defined";
#endif
"Finished.";

結果

"A is defined"; A;
"B is not defined";
"Finished.";

例5

unifdef -k ファイル名
#if 0
"Inside zero";
#else
"Outside zero";
#endif
"Finished.";

結果

"Outside zero";
"Finished.";


例6

unifdef -k ファイル名
#if 1
"Inside one";
#else
"Outside one";
#endif
"Finished.";

結果

"Inside one";
"Finished.";


例7

#ifdef A
"A is defined"; A;
#elif B>1
"B > 1"; B;
#else
"B <= 1"; B;
#endif
"Finished.";

結果

"A is defined"; A;
"Finished.";


例8

# ifdef A
"A is defined"; A;
# else
"A is not defined";
# endif
"Finished.";

結果

"A is defined"; A;
"Finished.";