#define用法

來源:互聯網
上載者:User

1.簡單的define定義 

#define   MAXTIME   1000 

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

if(i <MAXTIME){.........} 

編譯器在處理這個代碼之前會對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   4
#endif 
#ifndef   XXX   …   (#else)   …   #endif 

7.標頭檔(.h)可以被標頭檔或C檔案包含; 
重複包含(重複定義) 
由於標頭檔包含可以嵌套,那麼C檔案就有可能包含多次同一個標頭檔,就可能出現重複定義的問題的。 
通過條件編譯開關來避免重複包含(重複定義) 
例如 
#ifndef   __headerfileXXX__ 
#define   __headerfileXXX__ 
… 
檔案內容 
… 
#endif 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.