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