天天看點

#define定義宏的用法

(一)、簡單的,複習一下

#define PI 3.1415926

#define A(x) ((x)*(x)) 這裡的括号必不可少

(二)、define的單行定義

 ##=連接配接   #@=加單引号 #x=加雙引号 

1,

#define Conn(x,y) x##y  //表示x連接配接y,舉例說:

int n=Conn(123,456); 結果就是n=123456

2,

#define ToChar(x) #@x //就是給x加上單引号,結果傳回一個const char,舉例說:

char a=ToChar(1);結果就是a='1'

做個越界試驗char a=ToChar(123);結果就是a='3'

但是如果你的參數超過4個字元,編譯器就給你報錯了!error C2015:too many characters in constant

3、

#define ToString(x) #x //就是給x加上雙引号,例子

char *str=ToString(123213);就是str="123132"

(三) define的多行定義 使用\=續行

#define可以替代多行的代碼,例如MFC中的宏定義

#define MACRO(arg1,arg2) do {\

 \

 stmt1;\

 stmt2;\

 \

} while(0)

(四)

#define xxx() {} //标準C支援的

#define xxx() ({}) GCC新增的功能,主要是為了防止宏展開出現問題,預設展開時是要加上一個;的,容易出問題。

表示該宏有傳回值,最後一個表達式的傳回值作為宏函數的傳回值。

代碼:

#define A(a,b,c) ({a=1;b+=1;c=3;a+b+c;})

#include <stdio.h>

int main(){

 int a;int b=1;int c;int d;

 d=A(a,b,c);

 printf("%d,%d,%d,%d\n",a,b,c,d);

 return 0;

}

結果 1,2,3,6

(五)#define最重要的功能還是條件編譯

#ifdef WINDOWS

...

#else

...

#endif

#ifDef LINUX

...

#endif

#undef [MACRONAME] //取消定義宏

#ifndef PI

#define PI 3.1415926

#endif

繼續閱讀