轉載:
   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
*+ 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,不是因為我很喜歡()這個東西,而是當我在進行如下的調用的時候。

= 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