雑記
プリプロセッサの話
最終更新:
匿名ユーザー
-
view
コンパイラ、リンカと並んで実行ファイルの生成に重要なのが、プリプロセッサです。
C言語の場合、プログラムをビルドするときに、コンパイラに先立ってソースファイル内の
#
で始まる「プリプロセッサ命令」を解釈、実行します。
おなじみなのは、やはり
#include #define
あたりでしょうか。
ほかにも、#defineなどの定数定義に従って
#ifdef #elif #else #if #ifndef
などを使って同じソースファイルでデバッグルーチンをオンにしたりなどできます。
また、コメントをコンパイラに渡す前に削除しているのもプリプロセッサです。
これらの命令や制御はコンパイラとは関係なく、プリプロセッサによって行われるので、使い方によっては面白いことができます。
たとえば、gccなどではテキストファイルや他の言語のソースファイルでもプリプロセッサを適用することができます。
コマンドラインから
たとえば、gccなどではテキストファイルや他の言語のソースファイルでもプリプロセッサを適用することができます。
コマンドラインから
cpp <ファイル名>
で、プリプロセスだけを適用することができるわけです。
ということは、アセンブラなどにC/C++の書式の定数定義やコメントを使うことができるということです。これは結構便利です。
また、テキストファイルなどでも#defineの値を変えてやることで擬似差込印刷のようなこともできなくはありません。
#define NAME 山田 NAME 様 お元気でしょうか。・・・
などという書き方ができるわけです。
このテキストをプリプロセッサを通すことで、あて先などを簡単に変えてテキストファイルを出力することができます。
また、#if~#else~#endifなどのネストが深くなるとエディタでのソースが見づらくなってしまいます。
そういうときにプリプロセッサを通すことで実際に殺されている処理はどこなのかが簡単に把握できます。
(そのかわり、#includeなども展開されるので、標準ライブラリなどを#includeしているときはかなり大きなファイルが出力されますが)
(そのかわり、#includeなども展開されるので、標準ライブラリなどを#includeしているときはかなり大きなファイルが出力されますが)
プリプロセッサが行う処理は、比較的単純な文字列の編集です。
ですが、プリプロセッサがこのような準備をしてくれなければ、小さなプログラムを作るだけでも山のような関数宣言やexternを書かなくてはいけなくなってしまいます。
プリプロセッサのおかげで、作成・編集したい部位だけを意識することができるわけです。
簡単な機構ですが、ありがたいことだと思います。
簡単な機構ですが、ありがたいことだと思います。