宏定義#define 完全用法

1.別名或者數字的define定義

#define MAXNUM  100

MAXNUM  代表100,編譯器在編譯時會對MAXNUM替換爲100。

#define  ALIAS_FUNC  caculator

編譯時會替換ALIAS_FUNC成caculator

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 Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

x##y表示什麼?表示x連接y,舉例說:
int  n = Conn(123,456);  結果就是n=123456;
char* str = Conn("asdf", "adf")結果就是 str = "asdfadf";
怎麼樣,很神奇吧

再來看#@x,其實就是給x加上單引號,結果返回是一個const char。舉例說:
char a = ToChar(1);結果就是a='1';
做個越界試驗char a = ToChar(123);結果是a='3';
但是如果你的參數超過四個字符,編譯器就給給你報錯了!error C2015: too many characters in constant   :P

最後看看#x,估計你也明白了,他是給x加雙引號
char* str = ToString(123132);就成了str="123132";

(這裏參考了 hustli的文章)

4.如何定義宏、取消宏

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

例如:
定義宏MAXDELAY

#define MAXDELAY

取消宏定義MAXDELAY

#undef MAXDELAY

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

在很多頭文件(.h)可以被頭文件或C文件包含;
有時會存在重複包含(重複定義),或者嵌套,

那麼C文件就有可能包含多次同一個頭文件,就可能出現重複定義的問題的。
通過條件編譯開關來避免重複包含(重複定義)
例如
#ifndef __headerfileXXX__
#define __headerfileXXX__

文件內容

#endif

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章