main()
{
……
}
# undef PIPI的作用域
f1()
....表示PI只在main函數(shù)中有效,在f1中無(wú)效。
4. 宏名在源程序中若用引號(hào)括起來(lái),則預(yù)處理程序不對(duì)其作宏代換。
#define OK 100
main()
{
printf("OK");
printf("\n");
}
上例中定義宏名OK表示100,但在printf語(yǔ)句中OK被引號(hào)括起來(lái),因此不作宏代換。程序的運(yùn)行結(jié)果為:OK這表示把“OK”當(dāng)字符串處理。
5. 宏定義允許嵌套,在宏定義的字符串中可以使用已經(jīng)定義的宏名。在宏展開(kāi)時(shí)由預(yù)處理程序?qū)訉哟鷵Q。例如: #define PI 3.1415926
#define S PI*y*y /* PI是已定義的宏名*/對(duì)語(yǔ)句: printf("%f",s);在宏代換后變?yōu)椋?printf("%f",3.1415926*y*y);
6. 習(xí)慣上宏名用大寫(xiě)字母表示,以便于與變量區(qū)別。但也允許用小寫(xiě)字母。
7. 可用宏定義表示數(shù)據(jù)類型,使書(shū)寫(xiě)方便。例如: #define STU struct stu在程序中可用STU作變量說(shuō)明: STU body[5],*p;#define INTEGER int 在程序中即可用INTEGER作整型變量說(shuō)明: INTEGER a,b; 應(yīng)注意用宏定義表示數(shù)據(jù)類型和用typedef定義數(shù)據(jù)說(shuō)明符的區(qū)別。宏定義只是簡(jiǎn)單的字符串代換,是在預(yù)處理完成的,而typedef是在編譯時(shí)處理的,它不是作簡(jiǎn)單的代換, 而是對(duì)類型說(shuō)明符重新命名。被命名的標(biāo)識(shí)符具有類型定義說(shuō)明的功能。請(qǐng)看下面的例子: #define PIN1 int* typedef (int*) PIN2;從形式上看這兩者相似, 但在實(shí)際使用中卻不相同。下面用PIN1,PIN2說(shuō)明變量時(shí)就可以看出它們的區(qū)別: PIN1 a,b;在宏代換后變成 int *a,b;表示a是指向整型的指針變量,而b是整型變量。然而:PIN2 a,b;表示a,b都是指向整型的指針變量。因?yàn)镻IN2是一個(gè)類型說(shuō)明符。由這個(gè)例子可見(jiàn),宏定義雖然也可表示數(shù)據(jù)類型, 但畢竟是作字符
代換。在使用時(shí)要分外小心,以避出錯(cuò)。
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |