一,、預(yù)處理指令
//宏名 值;#define//宏的變量名全部是大寫(xiě),,結(jié)尾不需要寫(xiě)分號(hào)#define COUNT 6//還可以取消宏的定義#undef COUNT
/*一定要加括號(hào),,否則會(huì)出現(xiàn)意想不到的結(jié)果比如像下面這樣調(diào)用 sum(10,10) * sum(10,10);相當(dāng)于下面: 10+10*10+10 這樣替換過(guò)后改變了運(yùn)算順序,,也就改變了預(yù)期的運(yùn)算結(jié)果 所以一定要把所有變量都加上括號(hào) 再比如平方的例子一定要像下面這樣寫(xiě),每個(gè)形參都要加上括號(hào) #define Square(a)((a)*(a))*/#define sum(v1,v2)((v1)+(v2))int main(void){ int result = sum(11,10); printf('result=%d\n',result); //輸出了21 return 0;}
#define A 10int main(){//條件編譯判斷如果用到常量值,比如下面的A//則必須得是通過(guò)宏定義的,,因?yàn)樵诰幾g前已經(jīng)進(jìn)行了判斷//條件的括號(hào)可以省略 #if (A == 10) printf('a = 10\n'); #elif (A == 5) printf('a = 5\n'); #else printf('a is other number\n'); #endif //一定要有#endif結(jié)尾 return 0;}
當(dāng)進(jìn)行多文件開(kāi)發(fā)時(shí),,某些函數(shù)功能,需要在.h文件中進(jìn)行聲明,,還要將.h文件包含到某個(gè)文件中,,當(dāng)代碼量過(guò)大時(shí),有可能發(fā)生多次包含,,這雖然不會(huì)產(chǎn)生錯(cuò)誤,,但是會(huì)影響性能,所以在頭文件中可以利用條件編譯,,防止多次包含頭文件,,例如像下面這樣定義頭文件: /*解釋下面的寫(xiě)法的邏輯:如果沒(méi)有定義宏 ABC 那么就定義一個(gè)宏ABC并且聲明sum()函數(shù)如果第二次被包含時(shí),同樣會(huì)進(jìn)行判斷此時(shí)判斷的條件不成立,,因?yàn)榈谝淮伪话瑫r(shí)已經(jīng)創(chuàng)建了宏變量ABC所以這樣一來(lái),,避免了重復(fù)包含同一個(gè)頭文件ABC宏名稱不能和別的頭文件中的沖突!所以一般使用當(dāng)前.h頭文件名稱命名*/// #ifndef等同于#if !define,,對(duì)應(yīng)的有#ifdef 等同于 #if define#ifndef ABC// ABC一般寫(xiě)成當(dāng)前頭文件的名稱,,后面的值隨便寫(xiě) #define ABC 11 int sum(int,int);#endif
//需要分號(hào)typedef int MyInt;int main(){ //聲明別名后,可以這樣定義int類型變量 MyInt i = 10;}
//給指針類型起了一個(gè)別名Stringtype char* String;int main(){ String = “l(fā)uoguankun”;}
//定義了一個(gè)結(jié)構(gòu)體類型Studentstruct Student { int age;};//給結(jié)構(gòu)體Student起了個(gè)別名叫做Mystutypedef struct Student MyStu;//或者像下面這樣,,在定義結(jié)構(gòu)體類型的時(shí)候直接起別名,,這樣更加精簡(jiǎn)typedef struct Student { int age;}MyStu;//如果像上面這樣給結(jié)構(gòu)體起了別名,定義結(jié)構(gòu)體變量就變成了下面這樣:MyStu s1;MyStu s2;MyStu s3;//還有一種是沒(méi)有類型名的結(jié)構(gòu)體//下面的結(jié)構(gòu)體不能使用原本的方式創(chuàng)建結(jié)構(gòu)體變量//只能通過(guò)下面的方式創(chuàng)建結(jié)構(gòu)體變量,,無(wú)法用struct Student stu = {10};這種方式創(chuàng)建結(jié)構(gòu)體變量,,//而前面幾種兩種創(chuàng)建結(jié)構(gòu)體變量的方式都可以//而這個(gè)只能像下面這樣創(chuàng)建://MyStu stu;typedef struct { int age;}MyStu;
//以下是沒(méi)有使用typedef定義別名時(shí)的枚舉使用enum Sex {Man, Woman};enum Sex s = Man;//以下是使用typedef定義別名后的使用方法typedef enum Sex MySex;MySex s = man;//還可以在定義枚舉類型的同時(shí)定義別名(推薦這樣定義)typedef enum Sex {Man, Woman} MySex;MySex s1 = man;
//定義一個(gè)函數(shù)int sum(int a, int b){ return a+b;}//指向上面函數(shù)的指針聲明和調(diào)用int (*p)(int, int) = sum;int result = p(10,20);//使用typedef為指向函數(shù)的指針定義別名typedef int (*MyPoint)(int, int);MyPoint p = sum;int result = p(20,20);
//簡(jiǎn)化前struct Person{ int age;}; struct Person p = {20}; struct Person *p2 = &p;printf('age = %d\n”, p2->age);//簡(jiǎn)化后typedef struct Person{ int age;} *PersonPoint;struct Person p = {20}; PersonPoint p2 = &p;printf('age = %d\n', p2->age); 二,、static和extern對(duì)函數(shù)的作用
|
|