天天看點

“#if 0/#if 1 ... #endif”的作用

“#if 0/#if 1 ... #endif”的作用

(源自:http://www.cnblogs.com/MichaelOwen/articles/2128733.html)

1.

“#if 0/#if 1 ... #endif”的作用,我們知道,C标準不提供C++裡的“//”這樣的單行風格注釋而隻提供“”這樣的塊注釋功能,我們通常使用它寫代碼中說明性的注釋文字(注釋作用)以及在調試時關閉某段代碼對編譯器的可見性(屏蔽作用),當然,這裡所謂的“注釋作用”和“屏蔽作用”是我們從功能上下的主觀定義,對預處理器而言,兩者并無任何差別。對于前者,因為“注釋”中不會再出現“注釋”和“需要屏蔽的代碼段”,是以不會有嵌套的需求,是以通常不會有問題;而對于後者,當我們在調試程式時需要“屏蔽”某段代碼時,該段代碼中可能包含着前述的“注釋”和/或“已被屏蔽的代碼段”,這時就産生了“”嵌套使用的需求,但C标準恰恰不允許我們這麼幹。當你試圖使用嵌套的塊注釋功能時,會發現預處理器把最外層注釋的開始和最内層注釋的結尾這兩者之間的内容處理成了注釋,而其後一直到最外層注釋結尾的内容被當作了“有效代碼”——這顯然會引起若幹文法錯誤而導緻編譯中止。高手們開動腦筋想到了“#if 0 ... #endif”,它同樣由預處理器進行處理,同樣可以“屏蔽”一段代碼,你想把說明文字寫在裡面也可以,這些和“”都一樣,但不一樣的是:第一它允許嵌套(層數上限由預處理器決定)、第二你随時可以把“#if 0”改成“#if 1”來取消對某段代碼的“屏蔽”——很卓越的特性,快抛棄笨拙的“”吧!它唯一的缺點就是在編輯器中沒有“注釋”該有的文本顯示樣式。

2.

1 #if 0
2 
3    code
4 
5 #endif      

(1)code中定義的是一些調試版本的代碼,此時code完全被編譯器忽略。如果想讓code生效,隻需把#if 0改成#if 1 

(2)#if 0還有一個重要的用途就是用來當成注釋,如果你想要注釋的程式很長,這個時候#if 0是最好的,保證不會犯錯誤。(但是林銳的書上說千萬不要把#if 0 來當作塊注釋使用) #if 1可以讓其間的變量成為局部變量。 

(3)這個結構表示你先前寫好的code,現在用不上了,又不想删除,就用這個方法,比注釋友善。

轉載于:https://my.oschina.net/u/2433492/blog/1570982