轉(zhuǎn)載:
   http://folsailor.bokee.com/6156411.html

#define的用法zz
                                       
今天整理了一些#define的用法,與大家共享!
1.簡單的define定義

#define MAXTIME 
1000 

一個(gè)簡單的MAXTIME就定義好了,它代表1000,如果在程序里面寫

if(i
編譯器在處理這個(gè)代碼之前會(huì)對(duì)MAXTIME進(jìn)行處理替換為1000。

這樣的定義看起來類似于普通的常量定義CONST,但也有著不同,因?yàn)閐efine的定義更像是簡單的文本替換,而不是作為一個(gè)量來使用,這個(gè)問題在下面反映的尤為突出。

2.define的“函數(shù)定義”

define可以像函數(shù)那樣接受一些參數(shù),如下

#define max(x,y) (x)
>(y)?(x):(y);

這個(gè)定義就將返回兩個(gè)數(shù)中較大的那個(gè),看到了嗎?因?yàn)檫@個(gè)“函數(shù)”沒有類型檢查,就好像一個(gè)函數(shù)模板似的,當(dāng)然,它絕對(duì)沒有模板那么安全就是了??梢宰鳛橐粋€(gè)簡單的模板來使用而已。

但是這樣做的話存在隱患,例子如下:
#define Add(a,b) a
+b;
在一般使用的時(shí)候是沒有問題的,但是如果遇到如:c 
* Add(a,b) * d的時(shí)候就會(huì)出現(xiàn)問題,代數(shù)式的本意是a+b然后去和c,d相乘,但是因?yàn)槭褂昧薲efine(它只是一個(gè)簡單的替換),所以式子實(shí)際上變成了
c
*+ b*d

另外舉一個(gè)例子:
#define pin (
int*);
pin a,b;
本意是a和b都是int型指針,但是實(shí)際上變成int
* a,b;
a是int型指針,而b是int型變量。
這是應(yīng)該使用typedef來代替define,這樣a和b就都是int型指針了。

所以我們?cè)诙x的時(shí)候,養(yǎng)成一個(gè)良好的習(xí)慣,建議所有的層次都要加括號(hào)。

3.宏的單行定義
#define A(x) T_##x
#define B(x) #@x

#define C(x) #x
我們假設(shè):x
=1,則有:
A(
1)------〉T_1
B(
1)------'1'
C(1)------"1"

(這里參考了 hustli的文章)

3.define的多行定義

define可以替代多行的代碼,例如MFC中的宏定義(非常的經(jīng)典,雖然讓人看了惡心)

#define MACRO(arg1, arg2) 
do { \
/* declarations */ \
stmt1; 
\
stmt2; 
\
/*  */ \
while(0/* (no trailing ; ) */
關(guān)鍵是要在每一個(gè)換行的時(shí)候加上一個(gè)
"\" 

摘抄自http:
//www.blog.edu.cn/user1/16293/archives/2005/115370.shtml 修補(bǔ)了幾個(gè)bug

4.在大規(guī)模的開發(fā)過程中,特別是跨平臺(tái)和系統(tǒng)的軟件里,define最重要的功能是條件編譯。

就是:
#ifdef WINDOWS


#endif
#ifdef LINUX


#endif

可以在編譯的時(shí)候通過#define設(shè)置編譯環(huán)境

5.如何定義宏、取消宏

//定義宏
#define [MacroName] [MacroValue]
//取消宏
#undef [MacroName]
普通宏
#define PI (
3.1415926)

帶參數(shù)的宏
#define max(a,b) ((a)
>(b)? (a),(b))
關(guān)鍵是十分容易產(chǎn)生錯(cuò)誤,包括機(jī)器和人理解上的差異等等。

6.條件編譯
#ifdef XXX…(#
else) …#endif
例如 #ifdef DV22_AUX_INPUT
#define AUX_MODE 
3 
#
else
#define AUY_MODE 
3
#endif
#ifndef XXX … (#
else) … #endif

7.頭文件(.h)可以被頭文件或C文件包含;
重復(fù)包含(重復(fù)定義)
由于頭文件包含可以嵌套,那么C文件就有可能包含多次同一個(gè)頭文件,就可能出現(xiàn)重復(fù)定義的問題的。
通過條件編譯開關(guān)來避免重復(fù)包含(重復(fù)定義)
例如
#ifndef __headerfileXXX__
#define __headerfileXXX__

文件內(nèi)容

#endif

以上只是我從網(wǎng)絡(luò)上搜集了一些關(guān)于define的一些用法,可能還不全面,而且#define的使用本來也存在這爭(zhēng)議,如果你對(duì)#define的用法也很有興趣,可以來參加我們的討論(點(diǎn)擊下面的鏈接)http:
//www.dingge.com/forum/dispbbs.asp?boardID=43&ID=6972&page=1 



 #define 的注意用法 
在這里我們講講#define的一些誤用,因?yàn)樯弦黄呀?jīng)講了它的主要作用,這篇主要是一些比較常見的宏陷阱。首先輕松一下。如下的一個(gè)經(jīng)典例子。

#define 
private public
#include
using namespace std;
class c
{
private:
 
int i;
};

int main()
{
 c c1;
 c1.i
=1;
 cout
<}

#define 竟然讓private如此的脆弱,但是卻揭示了#define陷阱的根源,它僅僅是代碼替換機(jī)制而已,除此之外,它什么都不是。

讓我們步入正題,來看看下面的一個(gè)定義會(huì)產(chǎn)生一個(gè)什么樣的錯(cuò)誤?

#define f (x) ((x)
-1)

如果這個(gè)是一個(gè)函數(shù)就沒有什么問題
int f (int x) { return x-1; }

但是這里是define的世界,f(x)只見出現(xiàn)了一個(gè)可怕的空格
使得使得程序中如果出現(xiàn)了

f(
10)

這個(gè)代碼,最終就變成了

(
10) (10-1)(10)這樣一個(gè)奇怪的東西,當(dāng)然這個(gè)代碼倒是無法通過編譯,還是可以檢查出來的。算是讓我們逃過了一次,下次就沒有那么幸運(yùn)了,讓我們繼續(xù)。

#define 
abs(x) x>0? x:-x (引用自C語言陷阱與缺陷)

這個(gè)代碼有什么問題?也許大家也注意到了,我一直在用無數(shù)的()來寫#define,不是因?yàn)槲液芟矚g()這個(gè)東西,而是當(dāng)我在進(jìn)行如下的調(diào)用的時(shí)候。

= abs(a-b) //嗚呼,這將產(chǎn)生什么東西呢?

答案是:

a
-b>0? a-b : -a-b

這個(gè)顯然不是我們要的結(jié)果,因?yàn)楫?dāng)a
-b<0的時(shí)候?qū)⒎祷匾粋€(gè)-a-b,要解決這個(gè)問題,我們就要使用()來解決。

#define 
abs(x) (x)>0? (x):-(x)

現(xiàn)在這個(gè)代碼就可以正常的工作了。只要我們緊記#define是代碼替換的機(jī)制,不要對(duì)它有任何的奢求,就會(huì)避免上面的問題。另外,因?yàn)楹瓴皇且粋€(gè)類型,沒有數(shù)據(jù)安全檢查,在調(diào)試的時(shí)候也會(huì)產(chǎn)生障礙,所以,C
++就一直提倡使用const和inline來替換#define,也許,#define真的會(huì)在歷史的舞臺(tái)上消失,但define在C語言時(shí)代留下的功績卻不應(yīng)該忘記。

 

來自 http:
//community.csdn.net/Expert/topic/3195/3195102.xml?temp=.3936731