上に戻る
1       /************************************************************************/
2       /*******	3章.	不適切なマクロ				*********/
3       /*******				初版	NEC通信システム	*********/
4       /************************************************************************/
5       #define BADMAC1()				¥
6       	puts("3.1 危険マクロ1:                                ");	¥
7       	puts("          then節は単文に見えますが、  実は復文    ");
8       
9       #define BADMAC2()	if(1) { 					¥
10      	puts("3.2 危険マクロ2:                                ");	¥
11      	puts("          セミコロンを忘れてもコンパイル通過      ");	¥
12      } else				
上に戻る
13      
14      #define BADMAC3()	do {			¥
15      	puts("3.3 巨大マクロ:                                   ");	¥
16      	puts("          巨大マクロは期待するほど                ");	¥
17      	puts("          高速化に貢献しません                    ");	¥
18      	puts("          弊害として、                            ");	¥
19      	puts("                  (1)難解なコンパイルエラー       ");	¥
20      	puts("                  (2)コードサイズの肥大           ");	¥
21      	puts("          等があります。                          ");	¥
22      	puts("                  C-FAQ   10.4,   20.14   参照    ");	¥
23      } while(0)
上に戻る
24      
25      int	macroPanic(void)
26      {
27      	int	val ;
28      	/************************************************/
29      	/* 3.1. then節は単文にはみえませんが実は復文です*/
30      	/************************************************/
31      	val	= 0 ;
32      	if(val != 0)
33      		BADMAC1() ;
34      
35      	/************************************************/
36      	/* 3.2. セミコロン忘れてもコンパイル出来てします*/
37      	/************************************************/
38      	BADMAC2()

/* 1/ 3 警告01/02: A:e28: printfに対し、<stdio.h>をincludeして下さい C-FAQ 15.1.: %%%*/

39 printf("ここには、制御が来ません¥n") ;

40 41 /************************************************/ 42 /* 3.4. if文は成立しないはずなのに成立します */ 43 /************************************************/ 44 #define GODMAC4 (1|2) 45 #define BADMAC4 1|2 46 val = BADMAC4 ;

/* 2/ 3 警告01/01: A:e58: 『2==val&2』は『(2==val)&2』となり『2==(val&2)』とは別です:if(val != BADMAC4) { %%%*/

47 if(val != BADMAC4) {

48 printf(" val = 1|2 = 3 ¥n") ; 49 printf(" if(3 != 1|2) ¥n") ; 50 printf(" if(3!=1 |2) ¥n") ; 51 printf(" if(0 |2) ¥n") ; 52 } 53 54 /********************************************************/ 55 /* 3.5. (10+20) * 3 = 90になるはずが70になります*/ 56 /********************************************************/ 57 #define BADMAC5tashizan(X,Y) X+Y 58 #define GODMAC5tashizan(X,Y) ((X)+(Y)) 59 printf("(10+20)*3 = 90?= %d¥n", BADMAC5tashizan(10,20) * 3) ;

/* 3/ 3 警告03/03: B:e35: 返却値有り関数の末尾『}』に制御が来ました: macroPanic: %%%*/

60 }

上に戻る