C 言語 マクロ講座 小技編2007年03月27日 12時59分35秒

前回に紹介したマクロは gcc のプリプロセッサで処理をした。VOS C コンパイラのプリプロセスの結果はこうなる。








int main()
{
    int i ;



  { static int count_16; static int max_count_16 = 0;
  if(max_count_16 &&
  (++count_16 <= max_count_16 ||
  (count_16 % max_count_16) == 0)) printf ("DIAG(%d)\n", 0); }
  ;


  { static int count_17; static int max_count_17 = 1;
  if(max_count_17 &&
  (++count_17 <= max_count_17 ||
  (count_17 % max_count_17) == 0)) printf ("DIAG(%d)\n", 1); }
  ;
    for(i = 1; i <= 11; i++)


  { static int count_19; static int max_count_19 = 3;
  if(max_count_19 &&
  (++count_19 <= max_count_19 ||
  (count_19 % max_count_19) == 0)) printf ("DIAG(%d), i = %d\n", 3, i); }
  ;
}

#include 

#define SET(a, boolean) { static int b; b++; if(boolean) return; a = b;}

void main()
{
    int a = 0;

    SET(a, 0);
    printf("a = %d\n", a);

    SET(a, 1);
    printf("a = %d\n", a);
}

こちらは、gcc と違い、__LINE__ を先に展開してくれるので、デバッガで捕捉して値を変更するのも大した手間では無い。

普段から、構造体の配列を頻繁に使い、ループと共に使うことも多い。配列の要素の数を求める事も多くなる。やはり、そんな時はマクロの出番だ。


#define elmntsof(array) (sizeof(array)/sizeof(array[0]))

また、offsetof は stddef.h に既に定義済みのマクロ関数だ。


#define offsetof(type, field) ((size_t)(&((type *)0)->field))

このマクロは、C 言語の特徴とマクロによる言語の拡張性を一番良く表しているマクロだと思う。