c c define巨集定義用法語法詳解

2021-10-23 13:12:57 字數 2798 閱讀 3520

c/c++中,有這樣的乙個預處理,就是define 可以用 #define 定義乙個識別符號來表示乙個常量。特點是:定義的識別符號不佔記憶體,只是乙個臨時的符號,預編譯後這個符號就不存在了。define被稱作是巨集定義使用起來十分的方便簡單,比如下面的例子

#define n 1000000

這是乙個簡單的巨集定義,就是n值為1000000可以直接用到陣列裡舉個比較簡單的例子吧

#include

#define n 1000000

using

namespace std;

int a[n]

,b[n]

,c[n]

;

這樣就相當於定義了a,b,c三個大小都為1000000的陣列,當你發現測試資料越界時也可以直接改#define n 1000000進行補救,這樣不必手打1000000,而且更改方便

如果你下面要更新一下這個字母代表的數字你需要#undef命令

#undef  n
#define s sleep(900)
然後你就可以用s來代替sleep(900)了簡單實用,比如下面這個例子

#include

//習慣打萬能頭了

#include

//因為要用到sleep()函式,所以載入windows庫

#define s9 sleep(900)

#define s5 sleep(500)

using

namespace std;

intmain()

當然用代替一段**時可以寫出來這樣的詭異**

#include

//習慣打萬能頭了

#include

//因為要用到sleep()函式,所以載入windows庫

#define s9 sleep(900);

//加了分號

#define s5 sleep(500);

//加了分號

using

namespace std;

intmain()

是不是詭異至極?沒加分號也能編譯?!!,實際上是不正確的,在編譯器裡這個s9和s5已經變成了後面的sleep(900),sleep(500)了這樣就相當於s9,s5已經至極替換為上面的了,自然不用加分號,如果加上也沒什麼大問題,這裡只不過更好理解其特性罷了

這裡想必大家已經看出了大概,就是#define a ba就是b的另乙個稱呼罷了a為it b為int 時就做到了能用it a代表int a

這裡你可能會說,也不過如此嘛,但實際上define還有更高階的應用,就是他帶引數

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

i=max

(j+k,m-n)

;

這就是含有x,y雙引數的乙個巨集定義而且這些引數甚至可以是表示式

帶引數的巨集和帶參函式很相似,但有本質上的不同,把同一表示式用函式處理與用巨集處理兩者的結果有可能是不同的。

下面舉乙個例子進行對比:

#include

using

namespace std;

intsq

(int y)

intmain()

#include

#define sq(y) ((y)*(y))

using

namespace std;

intmain()

跑一下,是不是答案不一樣?

在使用函式的例子中,函式呼叫是把實參i值傳給形參y後自增1。然後輸出函式值。因而要迴圈5次。輸出1~5的平方值

而在使用巨集的例子中,巨集呼叫時,只作代換。sq(i++)被代換為((i++)*(i++))。這就造成的兩種結果的天差地別,所以要根據題目或應用合理選擇,充分發揮其價值

在用#define 定義時 , 斜槓" \ 「是用來續行的,」#「用來把引數轉換成字串,是給引數加上雙引號。」##「則用來連線前後兩個引數,把它們變成乙個字串,」#@"是給引數加上單引號。

比如:

#define conn(x,y) x##y

#define tochar(a) #@a

#define tostring(x) #x

int n =

conn

(123

,456

); 結果就是n=

123456

;char

* str =

conn

("asdf"

,"adf"

)結果就是 str =

"asdfadf"

;char a =

tochar(1

);結果就是a=

'1';

char

* str =

tostring

(123132

);就成了str=

"123132"

;

define還可以巢狀

#define n 456

#define s n*9998+y

C C define巨集定義

連線前後兩個值 define connect a,b a b int c combom 1,2 c 12 給後面的字元新增雙引號 define combom b b std string c combom laji cout c endl 和 在乙個巨集語句中只能使用乙個 給後面新增單引號 用 和 ...

vuex 的用法(語法糖)

mapactions 和 mapgetters都是vuex提供的語法糖,在底層已經封裝好了,拿來就能用,簡化了很多操作。其中.mapactions clickafn 相當於this.store.dispatch clickafn mapactions中只需要指定方法名即可,引數省略。mapgette...

巨集定義 號用法

define s x 自動給引數x轉換為 x 轉換為字串 這裡的語言符號不一定是巨集的變數 include define s x system x void main c語言中 被稱為連線符 它是一種預處理運算子,用來把兩個語言符號 token 組合成單個語言符號 這裡的語言符號不一定是巨集的變數。...