【例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 ,不能開平方!