LoginSignup
2
2

More than 5 years have passed since last update.

unifdefを使ってみる

Last updated at Posted at 2015-07-08

はじめに

「#ifdef」ディレクティブが多いソースコードってやだなぁ。
「#if 0」も多いなぁ。
不要なコードを見たくないし、削除できるツールが欲しいなぁ。
自作しようかとも考えたが、車輪の再発明かもしれないので探してみる。
お、あった、あった。unifdefか。
昔に見たことあるような気が...。

参考になった情報源

FreeBSD 一般コマンドマニュアル unifdef(1)
C言語ソースのifdefを削除するツール

BSD系のコマンドだったのか。
昔に使ったことある気がしてきた。
手元のMacでは、標準で使えることを確認。(MacOSはBSD系だから当たり前)
しかし、Windowsの環境で使いたいんだよね。

では、最新をダウンロード

unifdef - selectively remove C preprocessor conditionals
現時点では、2.10が最新だった。

インストールしてみよう、ビルドせなあかんのね

INSTALLには、以下のようにある。

The win32 subdirectory contains build files for MinGW and Visual
Studio 2010 which make use of the FreeBSD code plus some other
portability wrappers.

手元にVisual Studioがインストールしてあったので、解凍したファイル群の中のwin32フォルダにあるunifdef.slnを開いてビルド。
同じフォルダにあるwin32.cの65行目で、エラーが出る。

    count = _vsnprintf_s(str, size, _TRUNCATE, format, ap);

strがない?
恐らく、この関数の引数 bufだと判断し、下記のように修正。

    count = _vsnprintf_s(buf, size, _TRUNCATE, format, ap);

再ビルド。⇒OK

さてと、使い方は

unifdef.exe -h

とすれば、ヘルプもでるし、
Read the manual
にも、マニュアルがある。

使いたいオプションは、次のぐらいかな。

  • -b : 置き換えた行は空行にする (-l と同じ?)
  • -m : ファイルを上書きで書き換える(元ファイルはバックアップがあるから、置き換えでいいや。)
  • -k : #if を扱う(#if 0 - #endif を消す,#if 1 - #endifを残す)
  • -fpath : pathに指定したファイルの定義を読む

例えば、定義ファイルが sample.def、ソースコードが sample01.c だとしたら、

unifdef -b -m -k -fsample.def sample01.c

こんな感じで実行すればよいのね。

定義ファイルに、コメント入れたりしても問題ない模様。

sample.def (例)

// AAAは有効とする
#define AAA
// BBBは無効とする
#undef BBB
// #define CCC // CCCは残しておこう

一気に置き換え

さて、使い方もわかったので、プロジェクト全体に実行してみるとしよう。

henkan.bat

for /f "usebackq" %%i in (`dir /B /S *.h`) do undef -b -k -m fsample.def %%i
for /f "usebackq" %%i in (`dir /B /S *.c`) do undef -b -k -m fsample.def %%i

これで、全体が置き換わった。よしっ。

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2