defineの利用(2)


#defineは関数のようにも使えます。

#define name(arg1, arg2) { arg1 = arg2; }

のように書いておいて

name(LATA1, 1);

と書くと

LATA1 = 1;

と同義になります。

1.インライン関数として使う



関数を使うとコール等余分なオーバーヘッドがかかります。
defineを使うと、コンパイル前に置換されるだけですから、
オーバーヘッドがありません。
ただし、コードサイズは増加する傾向があります。



2.変則的な使い方1



#define GetArrayCount(Array) (sizeof Array / sizeof Array[0])

こんなことも少なくともMPLABXのXC8ではできます。
配列名を引数にとり、配列のカウントを求めることができます。
普通の関数ではこんなことできません。

3.変則的な使い方2



戻り値を返す関数を作ります。
これ自体は普通の関数を使ってもできるのですが、
ポインタを使わずに複数の値を返すことができます。

#define mul_add(result1, result2, a, b) {\
result1 = a * b;\
result2 = a + b;\
}

ポインタを使用するオーバーヘッド無しにいろいろなことができるってすばらしいと思います。