プリプロセッサ

コンパイラソースコードコンパイルする前段階で施す処理のためのプログラムが「プリプロセッサ

実行される命令は「プリプロセッサ指令」

処理自体は「プリプロセス」

と呼ばれる。


プリプロセッサ指令は、よく「プリプロセッサディレクティブ」とか言われるよね。
(ディレクティブっていうのがそもそも「コマンド」という意味らしい。)


プリプロセッサディレクティブまとめ(知ってるのだけ)


#define

#define ARRAY_SIZE 32

// ARRAY_SIZE が 32に置き換わる
int iArray[ARRAY_SIZE];

#undef

// ここで定義したものが
#define BAKA_YAROU

// 定義されていないことになる
#undef BAKA_YAROU

#line

// 使いかたその1
void main()
{
//#lineを書いた次の行の行番号を変更する。(__LINE__の中身の変わる)
#line 256
printf("%d",__LINE__); // ここが256行目になる
}

// 使い方その2
void main()
{
// ついでに__FILE__の内容を書き換えられる。
#line 256 "baka"
printf("%d,%s",__LINE__,__FILE__);
}

ちなみに、出力ウィンドウに表示されるエラーメッセージにも反映します。

#error

// 使い方
void main()
{
// 出力ウィンドウにエラーとしてメッセージを表示し、コンパイルを中断させる。
// #error の後にエラーメッセージとして表示したい文字列を指定する。
// その際に""はいらない。

#error 空かよ!

}

エラーメッセージ出力例

main.cpp(7) : fatal error C1189: #error : 空かよ!

#pragma

// 二重インクルード防止
#pragma once

// ライブラリリンク
#pragma comment (lib,"XXXX.lib")

// メッセージを出力
#pragma message("例なんだなぁ")

#if
#ifdef
#else
#else if
#endif

#define DEFINED

void main()
{
// 0なら処理されない、今は1だから処理される(※1)
#if 1

// DEFINEDは定義されているので処理される(※2)
#ifdef DEFINED

// ※2の閉じとして使う
#endif

// ※1 が1なので処理されない
#else

// ※1の閉じとして使う
#endif

}

他にも
#ifndef
#if defined(XX)
のような使い方もできるが、嫌って程使ってるので絶対に忘れないだろうということで書くのやめ。


# (空)

//ヌル指令
//書いた行が無視される。
# for(int i=0;i<10;i++)
# {
# printf("このブロックは処理されないよ〜ん\n");
# }

##

//トークン結合
#define test(first,last) first##last##

test(山田,太郎);

山田太郎

注:使い方間違ってるかもしれん





うん、相変わらずまとめ方が下手糞すぎて泣けてくる。