轉載:
http://folsailor.bokee.com/6156411.html
#define的用法zz
今天整理了一些#define的用法,與大家共享!
1.簡單的define定義

#define MAXTIME 1000

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

if(i
編譯器在處理這個代碼之前會對MAXTIME進行處理替換為1000。

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

2.define的“函數定義”

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

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

這個定義就將返回兩個數中較大的那個,看到了嗎?因為這個“函數”沒有類型檢查,就好像一個函數模板似的,當然,它絕對沒有模板那么安全就是了。可以作為一個簡單的模板來使用而已。

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

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

所以我們在定義的時候,養成一個良好的習慣,建議所有的層次都要加括號。

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

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

(這里參考了 hustli的文章)

3.define的多行定義

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

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

摘抄自http://www.blog.edu.cn/user1/16293/archives/2005/115370.shtml 修補了幾個bug

4.在大規模的開發過程中,特別是跨平臺和系統的軟件里,define最重要的功能是條件編譯。

就是:
#ifdef WINDOWS






#endif
#ifdef LINUX






#endif

可以在編譯的時候通過#define設置編譯環境

5.如何定義宏、取消宏

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

帶參數的宏
#define max(a,b) ((a)>(b)? (a),(b))
關鍵是十分容易產生錯誤,包括機器和人理解上的差異等等。

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文件包含;
重復包含(重復定義)
由于頭文件包含可以嵌套,那么C文件就有可能包含多次同一個頭文件,就可能出現重復定義的問題的。
通過條件編譯開關來避免重復包含(重復定義)
例如
#ifndef __headerfileXXX__
#define __headerfileXXX__
…
文件內容
…
#endif

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



#define 的注意用法
在這里我們講講#define的一些誤用,因為上一片已經講了它的主要作用,這篇主要是一些比較常見的宏陷阱。首先輕松一下。如下的一個經典例子。

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

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

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

讓我們步入正題,來看看下面的一個定義會產生一個什么樣的錯誤?

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

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

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

f(10)

這個代碼,最終就變成了

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

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

這個代碼有什么問題?也許大家也注意到了,我一直在用無數的()來寫#define,不是因為我很喜歡()這個東西,而是當我在進行如下的調用的時候。

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

答案是:

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

這個顯然不是我們要的結果,因為當a-b<0的時候將返回一個-a-b,要解決這個問題,我們就要使用()來解決。

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

現在這個代碼就可以正常的工作了。只要我們緊記#define是代碼替換的機制,不要對它有任何的奢求,就會避免上面的問題。另外,因為宏不是一個類型,沒有數據安全檢查,在調試的時候也會產生障礙,所以,C++就一直提倡使用const和inline來替換#define,也許,#define真的會在歷史的舞臺上消失,但define在C語言時代留下的功績卻不應該忘記。


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

http://folsailor.bokee.com/6156411.html

#define的用法zz

















































































































































































