上に戻る
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()
39 printf("ここには、制御が来ません¥n") ;
40
41 /************************************************/
42 /* 3.4. if文は成立しないはずなのに成立します */
43 /************************************************/
44 #define GODMAC4 (1|2)
45 #define BADMAC4 1|2
46 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) ;
60 }
上に戻る