C言語入門::プリプロセッサ
プリプロセッサの使い方です.
プリプロセッサはコンパイル前に処理されて,結果がコンパイラに渡されます.最後に「;(セミコロン)」はいりません.複数行に渡って書きたい場合は「\(¥マーク,バックスラッシュ)」を行末につけてください.
include
いつも使ってますね.指定したファイルを埋め込みます.つまり,そのファイルの中身をそこに書いたのと同じ結果になります.
ソースファイルと同じディレクトリにあるファイルは,「"~"」でくくって,標準のインクルードファイルがあるディレクトリのファイルは「<~>」でくくります.
define
これも出てきました.
#define SUN 0 #define MON 1 #define TUE 2 #define WED 3 #define THU 4 #define FRI 5 #define SAT 6 int main(){ int w=SUN; if (w == SUN) { printf("今日は日曜日です\n"); } return 0; }
この例だと,本当なら次回出てくる列挙型というのを使うべきですが.
もっと高度なこともできます.
#define SQUARE(x) (x*x) int main(){ printf("aquare 3 : %d\n",SQUARE(3)); return 0; }
括弧でくくるのを忘れないでください.単なる置き換えなので,「18/SQUARE(3)」が「18/3*3」に展開されたりして思わぬ結果になります.
if~else~endif
これはその範囲をコンパイルする条件を指定します.
#include <stdio.h> #define DEBUG int main() { #ifdef DEBUG printf("debug message\n"); #endif return 0; }
DEBUGがdefineされているときのみ,printfの行がコンパイルされて実行されます.
もう少し複雑に
#include <stdio.h> #define DEBUGLEVEL 2 int main() { #if DEBUGLEVEL printf("debug\n"); # if DEBUGLEVEL == 2 printf("debug message\n"); # elif DEBUGLEVEL >= 3 printf("debug level >= 3\n"); # endif #endif return 0; }
undef
defineしたものを取り消します.
次のようなのはどうなるでしょう?
#define A 10 #define TMP (A+1) #undef A #define A TMP #undef TMP
pragma
コンパイラやリンカに渡すオプションを指定できます.ただ,開発環境によって渡すオプションが違うのであまり使い道が無いような….
user32.libをリンクする例です.もちろん,コンパイル時にコマンドラインで指定したり,統合開発環境の設定で指定しても同じです.
#pragma link "user32.lib" // BCC #pragma comment(lib, "user32.lib") // VC++
基本的にpragmaは環境依存でしたが,C99でSTDCというのが追加されました.なので,以下の3つのみはC99の環境なら問題なく使えます.
#pragma STDC FP_CONTRACT on-off-switch #pragma STDC FENV_ACCESS on-off-switch #pragma STDC CX_LIMITED_RANGE on-off-switch
on-off-switchの部分は ON, OFF, DEFAULTから選ぶ.
ちょっとした小話
プリプロセッサはあまり使わない人もいますが,便利です.
この文書の履歴
- 2006-04-XX まだ未公開