【前言】
最近幾個月在做一個C語言代碼重構的項目,過程中也讓我對之前在書本上學習到的東西有些補充和鞏固,在本博中總結記錄下,梳理下零碎的知識點和經驗也加深印象,書寫是為了更好地思考。平時也都是用印象筆記之類的自己寫寫筆記,今天整理成博客,以便自己以后回顧。
【正文】
- C語言頭文件:將其理解為C語言模塊化編程向外提供一個接口描述文件。一般包括一些供外部函數或者文件使用的變量聲明,函數聲明,數據類型定義以及宏定義等。舉例:
-
/******************************************************************************* 頭文件 test001.h *******************************************************************************/ #ifndef TEST001_H_INCLUDED //防止頭文件重復引入 #define TEST001_H_INCLUDED /* * 在源碼文件test001.c中:#define TEST001_GLOBAL_VALUE_DEFINE * 設置宏ifdef判斷,如果是除test001.c外其他文件引入此頭文件,則以下的變量聲明和函數聲明都會加extern修飾 * 聲明為外部函數和全局變量 */ #ifdef TEST001_GLOBAL_VALUE_DEFINE #define TRNS_GLOBAL #define TRNS_GLOBAL_VAL(v) =(v) #else #define TRNS_GLOBAL extern #define TRNS_GLOBAL_VAL(v) #endif //函數聲明 TRNS_GLOBAL void InitTest(void); TRNS_GLOBAL void eventStart(int* point); //變量聲明 TRNS_GLOBAL double f_InitGetReq; TRNS_GLOBAL double f_ErrConfirm; #define BLM_SEND_BUFF_SIZE 12 #define BLM_RECV_BUFF_SIZE 128 #undef TRNS_GLOBAL #undef TRNS_GLOBAL_VAL #endif
- static關鍵字:
- 全局靜態變量:在任何函數體外聲明定義靜態變量,使其只在本文件有效,其可見范圍是從定義它的位置到文件結束,對其他模塊不可見。
- 局部靜態變量:在函數體內聲明定義靜態變量,其可見范圍是本函數,只有第一次調用此函數時,該static變量會被定義,其生命周期持續到整個程序結束,后續調用該函數時,其值還保持上一次調用后的值,不會進行重復定義。
- 靜態函數:被聲明為static的函數,表示其只在被模塊內可用,不作為對外的接口,可以理解為private。其他文件看不到,所有有重名的函數也沒有關系,互不影響。
- const關鍵字:
- 修飾變量:
//兩種形式,定義Value是不可變的int型變量 int const Value = 10; const int Value = 10; //外部鏈接,可以僅作為聲明,不作初始化 extern const int value = 20;
- 修飾指針:
//兩種形式,指針本身是常量,不可變 char * const pValue; const (char*) pValue; //兩種形式,指針指向的對象是常量 const char * pValue; char const * pValue; //兩者都是常量 const char * const pValue;
- 修飾函數參數:
//參數在函數體內不可變(無意義,形參,傳遞的實參是一個拷貝) void function(const int Num); //參數指針指向的內容在函數體內不可變 void function(const char* Num); //參數指針是常量(無意義,該指針是形參) void function(char* const pValue); //引用參數在函數體內不可變 void function(const int& Num);
- 修飾函數返回值:
//表示函數返回值一個常量,只能被賦值給const修飾的同類型指針 const char* function(); const char* str = function(); char* str1 = function();//出錯
- 作用與優勢:保護被修飾的成員,防止意外修改,增強程序的健壯性。相比於#define預編譯指令只是簡單的替換不進行類型檢查,const更加安全。編譯器通常部位普通const常量分配存儲空間,而將其保存在符號表中,在編譯期間就確定其值且不變,省去存儲於讀寫內存的操作,提高效率。
- 修飾變量:
- 文件包含:
- 可以這樣理解,文件A包含文件B,即A將文件B的內容拷貝過來在引入的位置展開,相當於將兩個文件合並。
- 所以簡單的文件包含,尤其是.c文件包含,很容易產生重復定義的問題。
- .h文件里也可以定義變量,但不建議這樣做,一方面也是為了引入頭文件時的重復定義問題,頭文件也加宏定義頭防止重復引入。