您好,登錄后才能下訂單哦!
#if 0 code #endif
(1)code中定義的是一些調(diào)試版本的代碼,此時code完全被編譯器忽略。如果想讓code生效,只需把#if 0改成#if 1
(2)#if 0還有一個重要的用途就是用來當(dāng)成注釋,如果你想要注釋的程序很長,這個時候#if 0是最好的,保證不會犯錯誤。(但是林銳的書上說千萬不要把#if 0 來當(dāng)作塊注釋使用)
#if 1可以讓其間的變量成為局部變量。
(3)這個結(jié)構(gòu)表示你先前寫好的code,現(xiàn)在用不上了,又不想刪除,就用這個方法,比注釋方便。
------------------------------------------------
通過我上面說的第一點(diǎn),我們可以知道,對“#if/#endif”的處理是預(yù)處理器完成的,而預(yù)處理器的唯一工作就是作“文字替換”的“預(yù)處理”工作,它并不負(fù)責(zé)常數(shù)符號表的生成、變量存儲空間的分配、代碼的重定位等工作,那么完全是給預(yù)處理器看的“#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++編譯器)編譯,都會在紅字那一行報錯——為什么呢?因?yàn)轭A(yù)處理器進(jìn)行“預(yù)處理”的時候發(fā)現(xiàn)if的條件表達(dá)式為“真”,所以它把那段代碼塊留下了,而只把代碼塊前后的“預(yù)處理指示符號(或者叫做預(yù)處理命令)”給清除掉了,這樣,預(yù)處理后的結(jié)果交給編譯器“翻譯”的時候,它發(fā)現(xiàn)在一個函數(shù)(在這里為main函數(shù))內(nèi)部的表達(dá)式語句(在這里是a = 0;)之后發(fā)現(xiàn)了變量聲明/定義語句(在這里是聲明并定義指針變量p的語句)——按照編譯器的規(guī)則,這是一個錯誤,所以它拒絕接受這樣的輸入、罷工并開始抱怨(中止編譯、給出錯誤信息)。
在這里順便對條件編譯(#ifdef, #else, #endif, #if等)進(jìn)行說明。以下分3種情況: 1. 情況1: #ifdef _XXXX ...程序段1... #else ...程序段2... #endif 這表明如果標(biāo)識符_XXXX已被#define命令定義過則對程序段1進(jìn)行編譯;否則對程序段2進(jìn)行編譯。 例: #define NUM ............. ............. ............. #ifdef NUM printf("之前NUM有過定義啦!:) \n"); #else printf("之前NUM沒有過定義!:( \n"); #endif } 如果程序開頭有#define NUM這行,即NUM有定義,碰到下面#ifdef NUM的時候,當(dāng)然執(zhí)行第一個printf。否則第二個printf將被執(zhí)行。 我認(rèn)為,用這種,可以很方便的開啟/關(guān)閉整個程序的某項(xiàng)特定功能。 2:情況2: #ifndef _XXXX ...程序段1... #else ...程序段2... #endif 這里使用了#ifndef,表示的是if not def。當(dāng)然是和#ifdef相反的狀況(如果沒有定義了標(biāo)識符_XXXX,那么執(zhí)行程序段1,否則執(zhí)行程序段2)。例子就不舉了。 3:情況3: #if 常量 ...程序段1... #else ...程序段2... #endif 這里表示,如果常量為真(非0,隨便什么數(shù)字,只要不是0), 就執(zhí)行程序段1,否則執(zhí)行程序段2。 如果有#if需要頂格寫
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。