gccrun.cmd その2
というわけで、バッチファイルでは、for /f
を使って、ファイルの中身を読むのだ。
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 )
C で書かれたソースコードの中に #include <windows.h>
という行があれば、windows.h
だけが %%a
に入る。もし、そのコードが windows.h
をインクルードしているのであれば、変数 win
に 1
を代入する。
このバッチファイル gccrun.cmd の第 2 引数に -c も -w も指定されなかった場合は、そうした処理により、win
の値が決まる。
:var REM コンパイルオプション set copt= if %win%==1 set copt=-mwindows
ラベル var
を作成している。どこかで goto var
をすれば、この行に処理が移る。変数 copt
を作成し、変数 win
が 1
ならば、-mwindows
という文字列を代入する。-mwindows
とは、gcc のコンパイルオプションの一つである。これを指定していれば、起動時にコンソール画面が開かないアプリケーションが出来上がる。
ソースコードの中に #include <windows.h>
があれば、win
が 1
になるということだったが、つまり、gcc に -mwindows
が付加されることを意味する。
windows.h をインクルードしているからといって、必ずしも、コンソール不使用アプリケーションでないとは限らない。なぜならば、main()
関数を使用しているなら、絶対にコンソールアプリケーションだからだ。しかも、それを使用しておらず、WinMain()
関数を使用していたとしても、printf()
などの標準入出力関数を使っているならば、それは、コンソールアプリケーションだ。
ソースに含まれる文: | main() | WinMain() |
---|---|---|
コンソールアプリか? | はい | ありえる |
ウィンドウアプリか? | いいえ | ありえる |
コンソール画面を使用しないアプリケーションであると断定するには、main()
がなく、WinMain()
があり、かつ、printf()
などの標準入出力関数がないということを調べ上げなければならない。くわえて、標準入出力を使わないからといって、コンソール画面を開いてはならないという決まりはない。
ソースファイルの中身をバッチファイルに読ませて、アプリケーションの種類を自動判別することは不可能なのである。
妥協案として、windows.h のインクルードの有無で判別しているのだ。
つづk