define的用法
1. 定義簡單的常數:定義常量,便于修改(切不可在后面加上分號!) #define N 1000 等效于 const int N = 1000; 但略有不同,define只是簡單替換,而不是作為一個量來使用.
2. 定義簡單的函數:注意多使用括號 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. 定義單行宏:主要有以下三種用法. 1) 前加##或后加##,將標記作為一個合法的標識符的一部分.注意,不是字符串.多用于多行的宏定義中.例如: #define A(x) ?T_##x 則 int A(1) = 10; //等效于int T_1 = 10; #define A(x) ?Tx##__ 則 int A(1) = 10; //等效于int T1__ = 10; 2) 前加#@,將標記轉換為相應的字符,注意:僅對單一標記轉換有效(理解有誤?) #define B(x) #@x 則B(a)即’a’,B(1)即’1’.但B(abc)卻不甚有效. 3) 前加#,將標記轉換為字符串. #define C(x) #x 則C(1+1) 即 ”1+1”.
4. 定義多行宏:注意斜杠的使用,最后一行不能用斜杠. #define DECLARE_RTTI(thisClass, superClass)\ virtual const char* GetClassName() const\? {return #thisClass;}\ static int isTypeOf(const char* type)\ {\ if(!strcmp(#thisClass, type)\ return 1;\ return superClass::isTypeOf(type);\ return 0;\ }\ virtual int isA(const char* type)\ {\ return thisClass::isTypeOf(type);\ }\ static thisClass* SafeDownCast(DitkObject* o)\ {\ if(o&&o->isA(#thisClass))\ return static_cast<thisClass*>(o);\ return NULL;\ }
5. 用于條件編譯:(常用形式) #ifndef _AAA_H #define _AAA_H //c/c++代碼 #endif 在大規模的開發過程中,特別是跨平臺和系統的軟件里,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? 8. 一些注意事項: 1) 不能重復定義.除非定義完全相同.#define A(x) … 和#define A 是重復定義. 2) 可以只定義符號,不定義值.如#define AAA 0 0 0 (請您對文章做出評價)
2. 定義簡單的函數:注意多使用括號 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. 定義單行宏:主要有以下三種用法. 1) 前加##或后加##,將標記作為一個合法的標識符的一部分.注意,不是字符串.多用于多行的宏定義中.例如: #define A(x) ?T_##x 則 int A(1) = 10; //等效于int T_1 = 10; #define A(x) ?Tx##__ 則 int A(1) = 10; //等效于int T1__ = 10; 2) 前加#@,將標記轉換為相應的字符,注意:僅對單一標記轉換有效(理解有誤?) #define B(x) #@x 則B(a)即’a’,B(1)即’1’.但B(abc)卻不甚有效. 3) 前加#,將標記轉換為字符串. #define C(x) #x 則C(1+1) 即 ”1+1”.
4. 定義多行宏:注意斜杠的使用,最后一行不能用斜杠. #define DECLARE_RTTI(thisClass, superClass)\ virtual const char* GetClassName() const\? {return #thisClass;}\ static int isTypeOf(const char* type)\ {\ if(!strcmp(#thisClass, type)\ return 1;\ return superClass::isTypeOf(type);\ return 0;\ }\ virtual int isA(const char* type)\ {\ return thisClass::isTypeOf(type);\ }\ static thisClass* SafeDownCast(DitkObject* o)\ {\ if(o&&o->isA(#thisClass))\ return static_cast<thisClass*>(o);\ return NULL;\ }
5. 用于條件編譯:(常用形式) #ifndef _AAA_H #define _AAA_H //c/c++代碼 #endif 在大規模的開發過程中,特別是跨平臺和系統的軟件里,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? 8. 一些注意事項: 1) 不能重復定義.除非定義完全相同.#define A(x) … 和#define A 是重復定義. 2) 可以只定義符號,不定義值.如#define AAA 0 0 0 (請您對文章做出評價)
轉載于:https://blog.51cto.com/19920906/277723
總結
- 上一篇: ***某知名网络安全公司
- 下一篇: Scaleform GFx