C語言預先處理之條件編譯
來源:互聯網
上載者:User
這是stdio.h的頭幾行:#if _MSC_VER > 1000
#pragma once
#endif#ifndef _INC_STDIO
#define _INC_STDIO#if !defined(_WIN32) && !defined(_MAC)
#error ERROR: Only Mac or Win32 targets supported!
#endif... 我們知道條件編譯有好幾種形式:1. 第一種形式:
#ifdef 標識符
程式段1
#else
程式段2
#endif
它的功能是,如果標識符已被 #define命令定義過則對程式段1進行編譯;否則對程式段2進行編譯。如果沒有程式段2(它為空白),本格式中的#else可以沒有, 即可以寫為: #ifdef 標識符
程式段 #endif 2. 第二種形式:
#ifndef 標識符
程式段1
#else
程式段2
#endif
與第一種形式的區別是將“ifdef”改為“ifndef”。它的功能是,如果標識符未被#define命令定義過則對程式段1進行編譯, 否則對程式段2進行編譯。這與第一種形式的功能正相反。
3. 第三種形式:
#if 常量運算式
程式段1
#else
程式段2
#endif
它的功能是,如常量運算式的值為真(非0),則對程式段1 進行編譯,否則對程式段2進行編譯。因此可以使程式在不同條件下,完成不同的功能。舉例:#if ( !defined(_MSC_VER) && !defined(__cdecl) )
#define __cdecl
#endif這裡涉及到defined(),用於判斷括弧中的變數是否被定義。 我們在寫條件編譯語句時一般寫成:#ifndef _INC_STDIO#define _INC_STDIO 常量#endif當然這裡的名字不合適,我只是表意一下。但在很多程式的原始碼中,只定義了標識符而沒有定義常量(value)!就像前面程式中的#ifndef _INC_STDIO
#define _INC_STDIO 這下我就不明白了,怎麼能沒有值呢?以後怎麼用啊?查了好多網頁和問了好幾個人,終於差不多搞明白了。結論:_INC_STDIO只是一個標識符,可以不定義值。這個標識符可以用來控製程序的流程。如果沒有定義標識符XXX,則定義標識符XXX。 條件編譯允許只編譯來源程式中滿足條件的程式段,使產生的目標程式較短,從而減少了記憶體的開銷並提高了程式的效率。使用預先處理功能便於程式的修改、閱讀、移植和調試,也便於實現模組化程式設計。 下面這段程式有點不解:為什麼輸出兩次_A_ is defined!?#include <stdio.h><br />#ifndef _A_<br />#define _A_<br />#endif<br />void myfunc();<br />void main()<br />{<br /> myfunc();<br /> myfunc();<br />}<br />void myfunc()<br />{<br />#ifdef _A_<br /> printf("_A_ is defined!/n");<br />#undef _A_<br />#endif<br />}<br />我認為只輸出一次,但運行了一下(VC 6.0),居然輸出了兩次!希望各位大蝦們不吝賜教,謝謝!