91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C中#if 0 和#if 1 詳解

發布時間:2020-08-08 09:02:44 來源:網絡 閱讀:536 作者:Joe科技 欄目:開發技術

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

2、現在再來說說2樓提到的自動變量局部化的問題:
------------------------------------------------
通過google,得知:

#if 0 code #endif




(1)code中定義的是一些調試版本的代碼,此時code完全被編譯器忽略。如果想讓code生效,只需把#if 0改成#if 1 
(2)#if 0還有一個重要的用途就是用來當成注釋,如果你想要注釋的程序很長,這個時候#if 0是最好的,保證不會犯錯誤。(但是林銳的書上說千萬不要把#if 0 來當作塊注釋使用) 
#if 1可以讓其間的變量成為局部變量。 
(3)這個結構表示你先前寫好的code,現在用不上了,又不想刪除,就用這個方法,比注釋方便。 
------------------------------------------------

通過我上面說的第一點,我們可以知道,對“#if/#endif”的處理是預處理器完成的,而預處理器的唯一工作就是作“文字替換”的“預處理”工作,它并不負責常數符號表的生成、變量存儲空間的分配、代碼的重定位等工作,那么完全是給預處理器看的“#if/#endif”怎么能控制變量的生存期、怎么能決定變量可以在哪里定義??
打開編輯器,寫下如下代碼:

C中#if 0 和#if 1 詳解

=========================== volatile unsigned char a;
unsigned int main(void)
{
        a = 0; #if 1 unsigned char *p = &a; *p = 255; #endif return 0;
} ===========================

C中#if 0 和#if 1 詳解



存成.c文件后用任何C編譯器(不包括C++編譯器)編譯,都會在紅字那一行報錯——為什么呢?因為預處理器進行“預處理”的時候發現if的條件表達式為“真”,所以它把那段代碼塊留下了,而只把代碼塊前后的“預處理指示符號(或者叫做預處理命令)”給清除掉了,這樣,預處理后的結果交給編譯器“翻譯”的時候,它發現在一個函數(在這里為main函數)內部的表達式語句(在這里是a = 0;)之后發現了變量聲明/定義語句(在這里是聲明并定義指針變量p的語句)——按照編譯器的規則,這是一個錯誤,所以它拒絕接受這樣的輸入、罷工并開始抱怨(中止編譯、給出錯誤信息)。

 

 

當注釋掉大塊代碼時,使用"#if 0"比使用"/**/"要好,因為用"/**/"做大段的注釋要防止被注釋掉的代碼中有嵌套的"/**/",這會導致注釋掉的代碼區域不是你想要的范圍, 當被注釋掉的代碼很大時容易出現這種情況,特別是過一段時間后又修改該處代碼時更是如此。

       在這里順便對條件編譯(#ifdef, #else, #endif, #if等)進行說明。以下分3種情況:
  1. 情況1: 
  #ifdef _XXXX
  ...程序段1...
  #else
  ...程序段2...
  #endif
  這表明如果標識符_XXXX已被#define命令定義過則對程序段1進行編譯;否則對程序段2進行編譯。
  例: 
  #define NUM
  .............
  .............
  .............
  #ifdef NUM
   printf("之前NUM有過定義啦!:) \n");
  #else
   printf("之前NUM沒有過定義!:( \n");
  #endif
  }
  如果程序開頭有#define NUM這行,即NUM有定義,碰到下面#ifdef NUM的時候,當然執行第一個printf。否則第二個printf將被執行。
  我認為,用這種,可以很方便的開啟/關閉整個程序的某項特定功能。
  2:情況2: 
  #ifndef _XXXX 
  ...程序段1... 
  #else 
  ...程序段2... 
  #endif
  這里使用了#ifndef,表示的是if not def。當然是和#ifdef相反的狀況(如果沒有定義了標識符_XXXX,那么執行程序段1,否則執行程序段2)。例子就不舉了。
  3:情況3:
  #if 常量 
  ...程序段1...
  #else
  ...程序段2...
  #endif 
  這里表示,如果常量為真(非0,隨便什么數字,只要不是0),
就執行程序段1,否則執行程序段2。
如果有#if需要頂格寫


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昌吉市| 乌恰县| 鄯善县| 泽库县| 长乐市| 潍坊市| 柳林县| 霍城县| 永寿县| 弥勒县| 石首市| 青浦区| 金湖县| 晋州市| 贡嘎县| 井冈山市| 连江县| 房山区| 都匀市| 海阳市| 万山特区| 巴彦淖尔市| 东兰县| 荃湾区| 沭阳县| 湘潭县| 增城市| 南溪县| 宜宾市| 托克逊县| 林甸县| 虎林市| 武安市| 峨边| 黄平县| 连平县| 抚州市| 虞城县| 新绛县| 湾仔区| 商河县|