#ifdef,#else,#endif,#if用法詳解.doc_第1頁
#ifdef,#else,#endif,#if用法詳解.doc_第2頁
#ifdef,#else,#endif,#if用法詳解.doc_第3頁
#ifdef,#else,#endif,#if用法詳解.doc_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

#ifdef,#else,#endif,#if用法詳解預處理就是在進行編譯的第一遍詞法掃描和語法分析之前所作的工作。說白了,就是對源文件進行編譯前,先對預處理部分進行處理,然后對處理后的代碼進行編譯。這樣做的好處是,經(jīng)過處理后的代碼,將會變的很精短。關于預處理命令中的文件包含(i nclude),宏定義(#define),書上已經(jīng)有了詳細的說明,在這里就不詳述了。這里主要是對條件編譯(#ifdef,#else,#endif,#if等)進行說明。以下分3種情況:1:情況1:#ifdef _XXXX.程序段1.#else.程序段2.#endif這表明如果標識符_XXXX已被#define命令定義過則對程序段1進行編譯;否則對程序段2進行編譯。例:#define NUM.#ifdef NUMprintf(之前NUM有過定義啦!:) n);#elseprintf(之前NUM沒有過定義!:( n);#endif如果程序開頭有#define NUM這行,即NUM有定義,碰到下面#ifdef NUM的時候,當然執(zhí)行第一個printf。否則第二個printf將被執(zhí)行。我認為,用這種,可以很方便的開啟/關閉整個程序的某項特定功能。2:情況2:#ifndef _XXXX.程序段1.#else.程序段2.#endif這里使用了#ifndef,表示的是if not def。當然是和#ifdef相反的狀況(如果沒有定義了標識符_XXXX,那么執(zhí)行程序段1,否則執(zhí)行程序段2)。3:情況3:#if 常量.程序段1.#else.程序段2.#endif這里表示,如果常量為真(非0,隨便什么數(shù)字,只要不是0),就執(zhí)行程序段1,否則執(zhí)行程序段2。我認為,這種方法可以將測試代碼加進來。當需要開啟測試的時候,只要將常量變1就好了。而不要測試的時候,只要將常量變0。# ifdef #ifndef 等用法 文件中的#ifndef頭件的中的#ifndef,這是一個很關鍵的東西。比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,于是問題來了,大量的聲明沖突。還是把頭文件的內容都放在#ifndef和#endif中吧。不管你的頭文件會不會被多個文件引用,你都要加上這個。一般格式是這樣的:#ifndef #define .#endif在理論上來說可以是自由命名的,但每個頭文件的這個“標識”都應該是唯一的。標識的命名規(guī)則一般是頭文件名全大寫,前后加下劃線,并把文件名中的“.”也變成下劃線,如:stdio.h#ifndef _STDIO_H_#define _STDIO_H_.#endif2.在#ifndef中定義變量出現(xiàn)的問題(一般不定義在#ifndef中)。#ifndef AAA#define AAA.int i;.#endif里面有一個變量定義在vc中鏈接時就出現(xiàn)了i重復定義的錯誤,而在c中成功編譯。結論:(1).當你第一個使用這個頭的.cpp文件生成.obj的時候,int i 在里面定義了當另外一個使用這個的.cpp再次單獨生成.obj的時候,int i 又被定義然后兩個obj被另外一個.cpp也include 這個頭的,連接在一起,就會出現(xiàn)重復定義.(2).把源程序文件擴展名改成.c后,VC按照C語言的語法對源程序進行編譯,而不是C+。在C語言中,若是遇到多個int i,則自動認為其中一個是定義,其他的是聲明。(3).C語言和C+語言連接結果不同,可能(猜測)時在進行編譯的時候,C+語言將全局變量默認為強符號,所以連接出錯。C語言則依照是否初始化進行強弱的判斷的。(參考)解決方法:(1).把源程序文件擴展名改成.c。(2).推薦解決方案:.h中只聲明 extern int i;在.cpp中定義#ifndef _X_H_#define _X_H_extern int i;#endif /_X_H_int i;注意問題:(1).變量一般不要定義在.h文件中。ifndef/define/endif的用法與實例分析用法:.h文件,如下:#ifndef XX_H#define XX_H#endif這樣如果有兩個地方都包含這個頭文件,就不會出現(xiàn)兩次包含的情況,因為在第二次包含時XX_H已經(jīng)有定義了,所以就不再 include了。-#ifndef GRAPHICS_H / 防止graphics.h被重復引用#define GRAPHICS_H#include / 引用標準庫的頭文件#include “myheader.h” / 引用非標準庫的頭文件void Function1(); / 全局函數(shù)聲明class Box / 類結構聲明;#endif-假設你的工程里面有4個文件,分別是a.cpp,b.h,c.h,d.ha.cpp的頭部是:#include b.h #include c.h b.h和c.h的頭部都是:#include d.h 而d.h里面有class D的定義。這樣一來,編譯器編譯a.cpp的時候,先根據(jù)#include b.h 去編譯b.h這個問題,再根據(jù)b.h里面的#include d.h ,去編譯d.h的這個文件,這樣就把d.h里面的class D編譯了;然后再根據(jù)a.cpp的第二句#include c.h ,去編譯c.h,最終還是會找到的d.h里面的class D,但是class D之前已經(jīng)編譯過了,所以就會報重定義錯誤。加上ifndef/define/endif,就可以防止這種重定義錯誤。-1.比如你有兩個C文件,這兩個C文件都include了同一個頭文件。而編譯時,這兩個C文件要一同編譯成一個可運行文件,于是問題來了,大量的聲明沖突。還是把頭文件的內容都放在#ifndef和#endif中吧。不管你的頭文件會不會被多個文件引用,你都要加上這個。一般格式是這樣的:#ifndef #define .#endif 在理論上來說可以是自由命名的,但每個頭文件的這個“標識”都應該是唯一的。標識的命名規(guī)則一般是頭文件名全大寫,前后加下劃線,并把文件名中的“.”也變成下劃線,如:stdio.h#ifndef _STDIO_H_#define _STDIO_H_.#endif2.在#ifndef中定義變量出現(xiàn)的問題(一般不定義在#ifndef中)。#ifndef AAA#define AAA.int i;.#endif里面有一個變量定義在vc中鏈接時就出現(xiàn)了i重復定義的錯誤,而在c中成功編譯。原因:(1).當你第一個使用這個頭的.cpp文件生成.obj的時候,int i 在里面定義了當另外一個使用這個的.cpp再次單獨生成.obj的時候,int i 又被定義然后兩個obj被另外一個.cpp也include 這個頭的,連接在一起,就會出現(xiàn)重復定義。(2).把源程序文件擴展名改成.c后,VC按照C語言的語法對源程序進行編譯,而不是C+。在C語言中,若是遇到多個int i,則自動認為其中一個是定義,其他的是聲明。(3).C語言和C+語言連接結果不同,可能(猜測)時在進行編譯的時候,C+語言將全局變量默認為強符號,所以連接出錯。C語言則依照是

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論