讀古今文學網 > C語言解惑 > 15.2 正確使用定義的宏 >

15.2 正確使用定義的宏

【例15.2】定義正確,使用不正確的例子。


#include <stdio.h>
#define INT_PTR int*
void main
()
{
      INT_PTR a
,b
;
      int c=25
;
      a=&c
;
      c=5* *a*5
;
      b=a
;
      printf
("%d
,%d\n"
,*a
,*b
);
}
  

宏定義INT_PTR為整數指針int*,但在程序中,語句


INT_PTR a
,b
;
  

在展開後,變為


int *a
, b
;
  

變量a是指針類型,但變量b卻是整數類型。也就是說,每次只能聲明一個變量。即


INT_PTR a
;INT_PTR b
;
  

或者採用如下等效聲明:


INT_PTR a
,*b
;
  

另外,為了提高易讀性,c的表達式最好將指針*a括起來。最終程序如下。


#include <stdio.h>
#define INT_PTR int*
void main
()
{
             INT_PTR a
, *b
;
             int c=25
;
             a=&c
;
             c=5* 
(*a
)*5
;
             b=
(int*
)*a
;
             printf
("%d
,%d\n"
,*a
,b
);
}
  

a是指針且指向整數變量a的地址,*a就是變量c的整數值。使用強制轉換將這個值轉換為指針類型並賦給指針b,所以運行結果為625,625。

【例15.3】下面的程序不能通過編譯,請找出問題並改正之。


#include <stdio.h>
#include <math.h>
#define ABORT
(msg
) printf
("%s\n"
,msg
);
void root
(const double a
)
{
     if 
(a<0
)  ABORT
("
數值小於0
,不能開平方""
);
     else printf
("%f\n"
,sqrt
(a
));
}
void main
()
{
     double a=30.25
,b=-9
;
     root
(a
);
     root
(b
);
}
  

編譯出錯,信息為:


error C2181
: illegal else without matching if
  

宏定義很簡單,也沒發現錯誤。仔細檢查if語句,看起來好像並沒有寫錯。現在把它展開,語句變為


if 
(a<0
) printf
("%s\n"
,msg
);;
else printf
("%f\n"
,sqrt
(a
));
  

原來else之前多了一個「;」號。如果不改變宏定義,可以使用「{}」號使if後面的語句變為復合語句以便去除這個多餘的「;」號,即


if 
(a<0
) {printf
("%s\n"
,msg
);;}
else printf
("%f\n"
,sqrt
(a
));
  

也就是root函數的定義改為:


void root
(const double a
)
{
     if 
(a<0
)  {ABORT
("
數值小於0
,不能開平方!"
);}
     else printf
("%f\n"
,sqrt
(a
));
}
  

當然,也可以將宏定義改變為:


#define ABORT
(msg
) printf
("%s\n"
,msg
)
  

後一種方式可能更貼切一些。輸出結果如下:


5.500000
數值小於0
,不能開平方!