C言語よく使うマクロ

C言語

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)を交換します

dowhile(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以降の式が実行されなくなります

コメント

この記事が気に入ったら
いいね!しよう
最新情報をお届けします。
タイトルとURLをコピーしました