○プリプロセッサ命令

■文字の置換

#include <stdio.h>

#define aaa "bbb"
#define i 10

int main(int argc, char* argv[])
{
	printf(aaa);
	printf("%d\n",i+i);

	return 0;
}

実行結果
bbb
20

■マクロは文字列の置換ですので応用しだいでいろいろ出来ます

#include <stdio.h>

#define AAA (int a){return a*2;}

int test AAA

int main(int argc, char* argv[])
{
	int i=test(1);
	printf("%d\n",i);

	return 0;
}

▽展開されるとこのような関数になります

int test (int a){return a*2;}

■上の改良版
\は改行文字です
複数行の文字を定義できます

#include <stdio.h>

#define AAA (int a){ \
		return a*2; \
	}

int test AAA

int main(int argc, char* argv[])
{
	int i=test(1);
	printf("%d\n",i);

	return 0;
}

■文字列置換によってマクロ関数で使用する変数を切り替える

#include <stdio.h>

int testaa=10;
int testbb=20;
int testcc=30;
int test40=40;
int test50=50;

#define VAL(n) test##n

int main(){
	printf("%d\n",VAL(aa));
	printf("%d\n",VAL(bb));
	printf("%d\n",VAL(40));
	return 0;
}

▽##がマクロ関数の引数により置き換えられます

上のプログラムを実行すると以下のようになります

10
20
40

■マクロ呼び出し(関数の様な感じの呼び出し)

#include <stdio.h>

#define ADD(a,b) (a+b)

int main(int argc, char* argv[])
{
	int i=ADD(10,10);
	printf("%d\n",i);

	return 0;
}

実行結果
20

■define定義を無効にする

#define FLAG	←FLAGを定義
#undef FLAG	←FLAGの定義を無効にしている

■条件付コンパイル #if 〜 #elif 〜 #else 〜 #endif

#include <stdio.h>

#define FLAG 20

int main(int argc, char* argv[])
{
	#if FLAG==10
		printf("10");
	#elif FLAG==20
		printf("20");
	#elif FLAG==30
		printf("30");
	#else
		printf("その他");
	#endif

	return 0;
}

実行結果
20

■識別子が定義されているかどうかにより分岐する #ifdef(#ifndef) 〜 #else 〜 #endif

#include <stdio.h>

#define FLAG

int main(){
	
#ifdef FLAG
//#ifndef FLAG になるとNOTになる

	printf("FLAGは定義されてます");
#else
	printf("FLAGは定義されてません");
#endif

	return 0;
}

実行結果
FLAGは定義されてます

■識別子が定義されているかどうかにより分岐する2

#include <stdio.h>

#define FLAG

int main(int argc, char* argv[])
{
	#if defined(FLAG)
		printf("FLAGは定義されてます");
	#else
		printf("FLAGは定義されてません");
	#endif

	return 0;
}

実行結果
FLAGは定義されてます



▲トップページ > Windows と C++