一、宏定義
(1)宏定義一般就是在開頭用#define *** ***,一般就是做一個簡單替換,後面沒有分號。
(2)宏定義的變量一般都是大寫,或者在所有宏定義變量前面添加統一的前綴。
(3)宏定義是預處理的一種,就是在代碼被編譯成0和1之前做得那個操作。
(4)還有一種是帶有參數的宏定義,如#define SUM(v1+v2) v1+v2(括號於後面之間有空格),在後面應用的時候SUM(a+b),其實就被替換成a+b了,相當於有參數的運算。
(5)宏定義效率比函數高。做簡單地運算用宏定義,復雜的還是用函數。
二、條件編譯(也是預處理的一種)
(1)一般條件語句,雖然滿足條件只執行一部分代碼,另一部分因為不滿足條件不被執行,但是所有代碼都會被編譯,所以文件會變大。
(2)條件編譯就是,滿足條件的就編譯,不滿足條件的就不編譯,文件大小得到控制,但明顯不利於閱讀。
(3)主要用法,就是定義一個宏變量,取不同值表示在開發階段和發布階段分別編譯,比如開發階段是網址****/test,發布階段是****/public,所以可以定義一個宏變量,在開發的時候用test,發布的時候把test換成public即可,而不用手動修改。
#define A 1 int main(int argc, const char * argv[]) { #if A==1 printf("hello"); #elif A==2 printf("world");//只編譯這一句,其他的相當於不存在 #else printf("hi"); #endif return 0; }
三、文件包含
(1)#include "***.h",.h文件不會被編譯,僅僅是被拷貝過來。可以重復導入,但是我們在C語言裏面可以用上面的條件編譯防止重復引導,即書寫“如果沒有一個宏變量,那麽創建這個宏變量,順便執行下面代碼”,這樣在重復導入的時候,後面的導入也會判斷發現已有宏變量,所以就能防止。
(2)對於OC語言,已經自動內嵌防止重復導入的功能,不用用戶操心。
(3)頭文件不能相互引用,只能單向的。
四、函數種類
(1)函數分為內部函數和外部函數,默認的所有函數都是外部函數,即本文件和其他文件都能調用,一般函數前面的extern被省略了。不能有同名的外部函數。
(2)內部函數前面需要有static,內部函數只能被本文件調用,可以通過調用其他文件的外部函數(調用內部函數)來調用其他文件的內部函數。內部函數可以同名。
註意:全局變量也分為內部變量和外部變量兩種,同理,外部的那種其他文件也能訪問,默認情況下都是外部的那種。關鍵字依然是static和extern。
五、typedef
(1)給類型名稱取個別名。如typedef int myInt,然後就可以用myInt定義變量了。更實用的在於定義結構體變量時候,平時都是struct person p1;我們可以用typedef struct person pp,用pp代替一長串,以後再書寫可以簡化成pp p1;。
(2)同理,定義枚舉變量也是比較復雜,可以用以上方法簡化。
(3)還可以為指向函數和結構體的指針取別名。
(3)typedef與#define的區別
#define STRING char* typedef char* string1; int main(int argc, const char * argv[]) { //#define和typedef的區別,在定義多個變量時,宏變量#define僅僅是替換,會產生問題 //下面一句相當於char *str1;和char str2; STRING str1,str2; //下面一句相當於char *str3和char *str4; string1 str3,str4; return 0; }
Tags:
include public return 王家河 hello
文章來源: