gccrun.cmd

前回の記事通り、久々に gcc で Windows アプリケーションを作成したわけだが、その際、バッチファイルを使って、ビルドおよび実行を簡単にできるような状態にしていた。そのバッチファイルは、GitHub のレポジトリ置いた

使い方は、gccrun src.c -c として実行すればコンソールアプリケーションとしてコンパイルするし、gccrun src.c -w とすればコンソールなしになる。

コメント

ソースコードについて、コメントを書き残しておく。

@echo off

まずは echo を off にする。これによって、バッチファイルのソースコードもろとも画面に表示されてしまうのを防ぐ。先頭の @ は、echo off 自体を画面に表示しないで実行する効果を発揮する。他のどんなコマンドにもつけられるので、@dir とか @cd.. とかいう使い方もできる。

REM 引数チェック
if "%1"=="" goto argerr
if not exist "%1" goto srcerr

%1 は、1 番目の引数を表す。gccrun src.c -c と実行したなら、%1src.c である。exist は、指定した名前のファイルが存在すれば真を返す演算子のようなものだ。

REM 出力プログラムの種類
set win=0
if "%2"=="-c" set win=0
if "%2"=="-w" set win=1
if "%2"=="" for /f "tokens=2 delims=<>" %%a in (%1) do (
  if "%%a"=="windows.h" set win=1
)

set win=0 で win という名前の変数を作成し、0 を代入している。%2 は 2 番目の引数だ。gccrun src.c -c でいうと、-c である。

バッチファイルでファイルの中身を読む

for は、覚えたてのテクニックである。for /f としているが、これで、ファイルの中身を読む処理をする。"tokens=2 delims=<>" は、for の振る舞いを決める指定だ。

for /f "delims=" %%a in (%1) do @echo %%a というふうに、delims に何も指定していなければ、一行ずつ echo する処理になる。

for /f "delims=<>" %%a in (%1) do @echo %%a にすると、一行は <> で split される。x<y>z という行があったとすると、x,y,z に区切られるが、%%a には最初の x が入る。

for /f "tokens=2 delims=<>" %%a in (%1) do @echo %%a で tokens に 2 を指定しているが、上記の例でいうと、これによって y が入るようになる。

x,y,z 3 つとも取りたいときは for /f "tokens=1-3 delims=<>" %%a in (%1) do @echo %%a,%%b,%%c とすればいい。%%b%%c は、自動で生成される変数である。最初につくった %%a は、平たくいえば変数名 a であるが、アルファベット順に b, c, d, e.. というふうに、自動でつくられる。アルファベットは小文字と大文字が使用でき、1 文字と決まっているので、同時に扱える変数の数は、数十個程度である。

つづk