====== あったら便利なマクロ達 ====== プログラムを書いているとふと、最大値や最小値、変数の符号をとる関数がほしいと思う時ってありますよね。だけど、関数で実現しようとすると、変数の型を気にしなければならずめんどくさいと思います。そこでこのような関数をマクロで実装しておこうというのが今回のテーマです。 #define ABS(IN) ((IN) < 0 ? - (IN) : (IN)) 絶対値をとるマクロです。 #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define MIN(a, b) ((a) < (b) ? (a) : (b)) 二つのものの最大値や最小値をとるマクロです。 #define MAX3(a, b, c) ((a) > (MAX(b, c)) ? (a) : (MAX(b, c))) #define MAX4(a, b, c, d) ((a) > (MAX3(b, c, d)) ? (a) : (MAX3(b, c, d))) #define MIN3(a, b, c) ((a) < (MIN(b, c)) ? (a) : (MIN(b, c))) #define MIN4(a, b, c, d) ((a) < (MIN3(b, c, d)) ? (a) : (MIN3(b, c, d))) 二つ以上の最大値や最小値をとるマクロです。 MaxとかMinを使っているので先に定義しておいてください。 #define SWAP(a,b) ((a != b) && (a += b,b = a - b,a -= b)) 二つの変数の値を入れ替えるマクロです。これ意外に重宝します。 #define SIGN(a) (a) / ABS(a) 変数の符号をとるマクロです。ABSというマクロが定義されていない と使えません。また0には使えません。 #define DEG_TO_RAD(deg) (((deg) * PI) / 180.0) #define RAD_TO_DEG(rad) (((rad) * 180.0) / PI) PIは円周率です。どっかでdefineしておいてください。 こいつらはラジアンと角度の変換するマクロです。 こいつらも結構便利です。 ざっと代表的なものをあげてみました。他にもあったら追加しておいてください。引数をとるマクロの形式が分からないのであれば、適当に調べてください。まあ、普通の関数みたいに使えば大丈夫です。ちなみにマクロ名が大文字なのは慣習です。マクロで作ったものと、そうでないものを区別するために一般的にマクロで作ったものは大文字にするというのがあります。