c 語言中巨集定義和定義全域性變數的區別

清風oo發表於2019-01-21
  1. 巨集定義和定義全域性變數的區別: 
  2. 1 作用時間不同。 
  3. 巨集定義在編譯期間即會使用並替換,而全域性變數要到執行時才可以。 
  4. 2 本質型別不同。 
  5. 巨集定義的只是一段字元,在編譯的時候被替換到引用的位置。在執行中是沒有巨集定義的概念的。而變數在執行時要為其分配記憶體。 
  6. 3 巨集定義不可以被賦值,即其值一旦定義不可修改,而變數在執行過程中可以被修改。 
  7. 巨集定義只有在定義所在檔案,或引用所在檔案的其它檔案中使用。 而全域性變數可以在工程所有檔案中使用,只要再使用前加一個宣告就可以了。換句話說,巨集定義不支援extern。 

 

  在C/C++中,巨集定義的有效範圍被規定為當前檔案內有效。

    “當前檔案內有效”分為兩種情況,一種是定義在標頭檔案中,另一種是定義在原始檔中。

    在標頭檔案中的巨集定義隨著標頭檔案一同被包含到原始檔中時,此時巨集定義在該原始檔中有效,當標頭檔案中的巨集定義隨著該標頭檔案一起被包含到另一個標頭檔案中,而這另一個標頭檔案又被另一個原始檔包含,則該巨集定義在最終被包含的原始檔中同樣有效。

    當巨集定義定義在原始檔中時,只在當前原始檔中有效,即使當前原始檔所對應的標頭檔案被其它原始檔包含,由於相應的標頭檔案中不包含巨集定義,其它原始檔也不能直接使用該巨集定義。(也就相當於檔案內的私有成員,只能被檔案內的成員使用)。

    當然在該檔案中有效的含義是在巨集定義語句之後的部分,同一個檔案中巨集定義語句之前,使用該巨集是無效的。

    這就是C語言中巨集定義的作用範圍,在C++中無論是類內還是方法內都不建議使用巨集定義,可用const成員代替,C++中類內的巨集定義和方法中的巨集定義都是一樣的,只跟類所在的檔案相關,與類相關的概念(如繼承)並沒有什麼關係。在定義兩個相同的巨集名對應不同的值時,取最新定義的巨集名。

    在C++類內或者方法內定義的巨集不具有很好的可讀性,寫出來估計會被同事打死的吧。

相關文章