【Xcode學C-6】宏定義#define、條件編譯#if、文件包含、內部外部函數以及typedef的用法

分類:編程 時間:2017-03-22

一、宏定義

(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

文章來源:


ads
ads

相關文章
ads

相關文章

ad