○プリプロセッサ命令
■文字の置換
#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++