天天看點

C語言知識點總結:預處理指令、宏

預處理指令

        程式員蓑編寫的代碼并不能被真正的編譯器編譯,需要一段程式把代碼翻譯一下

        翻譯的過程叫做預處理,負責翻譯的程式叫做預處理器,被翻譯的代碼叫做預處理指令,以#開頭的代碼都是預處理指令

        1)檢視預處理過程

                    gcc -E code.c     把預處理的結果顯示到終端上

                    gcc -E code.c -o code.i     把預處理指令存儲到code.i預處理檔案中

        2)預處理指令分類

                #include 檔案包括

                #include <>    從系統指定路徑查找并導入頭檔案

                #include ""    從目前路徑下查找,如果找到不到再從系統指定路徑查找并導入頭檔案

                通過編譯器參數指定查找路徑  -I /path

                通過作業系統設定環境變量來指定頭檔案的查找路徑

                #define 定義宏

                宏常量: #define 宏名 資料

                #define MAX 50

                        優點:能夠提高代碼可讀性、提高可擴充性(友善批量修改)、提高安全性、還可以用在在case後面使用

        注意:一般宏名全部大寫,末尾不要加分号

預定義的宏:

                        __func__    擷取函數名        %s

                        __FILE__    擷取檔案名        %s

                        __DATE__    擷取目前日期    %s

                        __TIME__    擷取目前時間    %s

                         __LINE__    擷取目前行号    %d

        1、宏函數:帶參數的宏

                不是真正的函數,不檢查參數類型,沒有傳參,隻是值替換,沒有傳回值,隻有表達式的機選結果

                #define SUM(a,b,c) a+b+c

                運作步驟

                        1)、把代碼替換為宏函數後面的表達式代碼

                        2)、把宏函數代碼中是用的參數替換為調用者提供的資料

                注意:定義宏常量、宏函數不能直接換行,可以使用續行符 \ 放在末尾可以換行也可以使用大括号保護代碼

        2、宏函數的二義性:

                1)原因:由于宏函數所處的位置、參數不同導緻宏函數有不同的解釋和功能,這種叫做宏的二義性

                2)避免方法:

                        (1)宏函數整體代碼加小括号

                        (2)每個參數都加小括号

                        (3)使用宏函數時盡量不要提供帶自變運算符的變量作為參數

        3、運算符:

                 #   把宏函數的參數變成字元串

                ##  合并兩個參數變成辨別符

條件編譯

        1、根據條件決定讓代碼是否參與最終的編譯

        2、版本控制:

                        #if

                        #elif

                        #else

                        #endif                      可以使用 #if 0 ................. #endif  對内容進行注釋

        3、頭檔案衛士:防止頭檔案重複包含

                        #ifndef 宏名(頭檔案名全大寫,—替代.)

                        #define 宏名(頭檔案名全大寫,—替代.)

                        #endif//宏名(頭檔案名全大寫,—替代.)

        4、判斷、調試代碼:

                        #ifdef 宏名(DEBUG)

                        #else

                        #endif

                注意:可以通過編譯參數 -D宏名 定義宏

        5、封裝調試資訊函數

#ifdef DEBUG
    #define debug(...) printf(__VA_ARGS__);
#else
    #define debug(...)
#endif
           

        6、封裝提示錯誤資訊宏函數

#define error(...) printf("%s %s %s %m %d %s
%s",__FILE__,__func__,__VA_ARGS__,__LINE__,__DATE__,__TIME__);
           

繼續閱讀