e74.c

マクロ置換子#


/********************************/ /* 文字列処理 */ /********************************/ /*危険*/ #define SIZE(string) { "string" , sizeof(string) }
/* 標準Cはこちらを使用して下さい。*/ #define SIZE(string) { #string , sizeof(string) }
int main() /*4.4.2:文字列処理:『危険』要条件コンパイル*/ { static struct { char *name ; int size ; } sizelist[] = { SIZE(char) , SIZE(short) , SIZE(int) , SIZE(long) , } ; unsigned int i ; for(i = 0 ; i < sizeof(sizelist)/sizeof(sizelist[0]) ; i++) { printf("%20s : %d¥n",sizelist[i].name,sizelist[i].size) ; } #define SNAP(n) (void)printf("DEBUG: %d¥n",n) SNAP(__LINE__) ; #define CNTL(c) (037 & 'c') printf("%c¥n",CNTL(L) ) ; printf("%x¥n",CNTL(L) ) ; return(0) ; }
解説 マクロの引数は、 文字列の中に展開されないコンパイラが有ります。 展開されないコンパイラでは、 #マクロ置換子を使用する必要があります。 危険なのは 展開する/しないに、かかわらずエラーが出ない事です。