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以降の式が実行されなくなります
コメント