巨集定義和列舉型別的區別

2021-06-26 21:10:40 字數 817 閱讀 7642

摘要:在c語言的程式設計中,我們常常需要定義一些常量,此時是採用巨集定義還是採用列舉型別呢?它們有哪些區別?本文主要**這個問題。

一、作用域對比

1.1巨集定義的預設作用域為整個檔案,如果定義了巨集定義結尾的地方,作用域就到那個地方;這裡有乙個潛在的危險,如果我們的標頭檔案中包含了巨集定義,此時會導致巨集定義沒有按照程式設計師的意願而產生了範圍擴充套件,當在另外的檔案中有了相同的巨集定義以後,就會產生衝突導致編譯無法通過。

在c語言程式設計中,對乙個比較大型的專案,用到的庫會比較多,如果設計的稍有疏忽,便可能產生巨集定義的衝突。專案中有乙個例子就是發生在兩個標頭檔案都定義了「isspace(ch)」這個巨集,並且兩個巨集定義不太一致,從而導致了整個工程無法編譯。

這樣的方法是解決巨集定義衝突的乙個無奈之舉。事實上,巨集定義的作用域早就被人詬病,特別放在標頭檔案中,被數次包含之後,在不經意間又被覆蓋,然後又被重新使用,也許此時已經不是原來的意思了,而我們在使用時還不知道。

為此,有乙個簡單的原則可以減少巨集定義的衝突,那就是盡量不要將巨集定義置於標頭檔案當中,除非有乙個非將其置於標頭檔案不可的理由。除此之外,還有乙個策略 是,如果乙個檔案/庫的某個函式不會被其他地方所使用,那麼就不要將其置於標頭檔案當中。標頭檔案應該是介面,而不是麻辣燙那樣的大雜燴。

1.2列舉型別的作用域就是列舉變數的作用域,這個可控性更高。

二、設計目的

巨集定義在編譯階段之間就已經展開,多半是為了完成「**縮減」(某些時候有點像函式)或者「程式的易於維護效能」(某些時候有點像全域性變數)。

而列舉型別是為了實現限制輸入。 另外,注意列舉成員只能是整形變數。

列舉和巨集的區別

列舉常量與巨集的區別主要有幾點 1。列舉常量是實體中的一種,但巨集不是實體 2。列舉常量屬於常量,但巨集不是常量 3。列舉常量具有型別,但巨集沒有型別,列舉變數具有與普通變數相同的諸如作用域 值等性質,但巨集沒有,巨集不是語言的一部分,它是一種預處理替換符。列舉型別主要用於限制性輸入,例如,某個函式...

列舉和巨集的區別

區別1 巨集是是在預編譯階段進行的文字替換,而列舉是在編譯的階段進行的處理的 所以巨集不能除錯,列舉可以除錯。區別2 巨集定義時需要一條一條的定義,而列舉定義一次就可以了 define mon 1 define tues 2 define wed 3 enum mon,tues,wed列舉中的每一項...

巨集定義與型別定義的區別

先來看一下巨集定義與型別定義的定義。一般來說,巨集定義 define 是相當於字元替換,在 預編譯時就進行替換,編譯時候所有巨集定義的 改變為被替換的 不限制任何 任何字元都可以進行巨集定義,巨集定義可以寫在程式中的任何位置,它的作用範圍從定義觸到檔案尾,在這些範圍內都可以用巨集名進行替換,巨集是針...