C言語でよく使うマクロをまとめておきます
オブジェクト形式マクロ
limits.h関係
| マクロ | データ型 | 値の範囲 | 参考値 |
|---|---|---|---|
| SHRT_MIN | short | 最小値 | -32768 |
| SHRT_MAX | short | 最大値 | 32767 |
| INT_MIN | int | 最小値 | -2147483648 |
| INT_MAX | int | 最大値 | 2147483647 |
| LONG_MIN | long | 最小値 | -2147483648 |
| LONG_MAX | long | 最大値 | 2147483647 |
| LLONG_MIN | long long | 最小値 | -9223372036854775808 |
| LLONG_MAX | long long | 最大値 | 9223372036854770000 |
| USHRT_MAX | unsigned short | 最大値 | 65535 |
| UINT_MAX | unsigned | 最大値 | 4294967295 |
| ULONG_MAX | unsigned long | 最大値 | 4294967295 |
| ULLONG_MAX | unsigned long long | 最大値 | 18446744073709500000 |
| CHAR_BIT | char | 最大値 | 8ビット |
| UCHAR_MAX | unsigned char | 最大値 | 255 |
| SCHAR_MIN | signed char | 最小値 | -128 |
| SCHAR_MAX | signed char | 最大値 | 127 |
| CHAR_MIN | char | 最小値 | -128 |
| CHAR_MAX | char | 最大値 | 127 |
<limits.h> をインクルードしておく必要があります
値は、処理系によって異なります
8ビット = 1バイト (1文字)
関数形式マクロ
宣言関係
#define 関数名(変数) 処理内容
関数名と(変数)の間にスペースを入れてなりません。その場合はオブジェクト形式マクロになってしまいます。
#define diff(x, y) (((x) > (y)) ? ((x) - (y)) : ((y) - (x)))
式に( )を付けておく
x → (x)
(x) > (y) → ((x) > (y))
優先順位や結合性により意図しない演算を予防します
例えば下記のようなことが起こります
#define mul_a(a, b) = (a * b)
#define mul_b(a, b) = ((a) * (b))
printf("%d\n", mul_a(5 + 2, 5)); // 15
printf("%d\n", mul_b(5 + 2, 5)); // 35
a++ などのインクリメントを使用すると、インクリメントが2回以上行われることがあります
複数の式を実行することもできます
#define マクロ名(変数) (式1, 式2)
式1 と 式2 の間に、
, を付けますswap
#define swap(type, a, b) do { type t = (a); (a) = (b); (b) = (t); } while(0)
type型の2つの値(a, b)を交換します
do ~ while(0) を付けます
もし、do ~ while(0) を付けずに定義した場合下記のようなことが起こります。
#define swap(type, a, b) {type t = (a); (a) = (b); (b) = (t)}
if(x > y)
swap(int, x, y);
else
swap(int, x, z);
展開すると、
if(x > y){
int t = x; x = y; y = t; };
else{
int t = x; x = z; z = t; };
; があるために、else以降の式が実行されなくなります
コメント