C語言之頭文件,static與const關鍵字


【前言】

  最近幾個月在做一個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文件里也可以定義變量,但不建議這樣做,一方面也是為了引入頭文件時的重復定義問題,頭文件也加宏定義頭防止重復引入。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM