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) ;
}
解説
マクロの引数は、
文字列の中に展開されないコンパイラが有ります。
展開されないコンパイラでは、
#マクロ置換子を使用する必要があります。
危険なのは
展開する/しないに、かかわらずエラーが出ない事です。