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;\
}
ポインタを使用するオーバーヘッド無しにいろいろなことができるってすばらしいと思います。