您好,登錄后才能下訂單哦!
#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”怎么能控制變量的生存期、怎么能決定變量可以在哪里定義??
打開編輯器,寫下如下代碼:
=========================== volatile unsigned char a; unsigned int main(void) { a = 0; #if 1 unsigned char *p = &a; *p = 255; #endif return 0; } ===========================
存成.c文件后用任何C編譯器(不包括C++編譯器)編譯,都會在紅字那一行報錯——為什么呢?因為預處理器進行“預處理”的時候發現if的條件表達式為“真”,所以它把那段代碼塊留下了,而只把代碼塊前后的“預處理指示符號(或者叫做預處理命令)”給清除掉了,這樣,預處理后的結果交給編譯器“翻譯”的時候,它發現在一個函數(在這里為main函數)內部的表達式語句(在這里是a = 0;)之后發現了變量聲明/定義語句(在這里是聲明并定義指針變量p的語句)——按照編譯器的規則,這是一個錯誤,所以它拒絕接受這樣的輸入、罷工并開始抱怨(中止編譯、給出錯誤信息)。
在這里順便對條件編譯(#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需要頂格寫
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。