C語言,#define語句的用法
1.簡單的宏定義 格式:#define 標識符 替換列表 說明:替換列表可以是數,字符串字面量,標點符號,運算符,標識符,關鍵字,字符常量。
注意:替換列表是可以為空的 典型錯誤: #define N = 100 int a[N]; /*這樣會成為int a[= 100],這里會處理成為一種標識記號一樣*/ #define N 100; int a[N]; /*帶分號的定義會成為int a[100;],這是一種很常見的錯誤*/ #define pin (int*); pin a,b; int* a,b; /*本意是a和b都是int型指針,但是實際上變成int* a,b;a是int型指針,而b是int型變量。這是應該使用typedef來代替define,這樣a和b就都是int型指針了。
*/ 典型的使用方法: 使用宏定義可以自己根據自己的習慣來定義甚至改變C語言的語法習慣,例如: #define BEGIN { #define END } int main()BEGIN printf ("DEFINE----\n"); END 定義一個循環 #define LOOP for(;;) 重新定義數據類型 #define IT int 2.帶參數的宏 #define 標識符(x1,x2,x3。xn) 替換列表 (注意:x1,x2,x3..是宏的參數,標識符和其左括弧之間不能有空格) 使用方法: #define MAX(x,y) ((x)>(y)?(x):(y)) i=MAX(j+k,m-n); 替換為: i=MAX((j+k)>(m-n)?(j+k):(m-n)); #define SI_EX(n) ((n)%2==0) if(SI_EX(i)) i++; 替換為: if(SI_EX((i)%2==0)) 通過以上例子可以看出,標識符帶參數(X1,X2,X3。
..)在替換時會被替換列表(Y1,Y2,Y3。.)對應的替換,但是和順序無關。
3.宏的特殊單行定義 #define A(x) T_##x #define B(x) #@x #define C(x) #x x=1 替換為: A(1)------> T_1 (T_##x,##符號是記號粘黏符號,將前后的字符粘黏起來。) B(1)------> '1' ( #@x , #@ 符號會將宏的參數進行字符串字面量化,并且加‘’號) C(1)------> "1" ( #x ,#符號會將宏的參數進行字符串字面量化,并且加""號) *的多行定義 define可以替代多行的代碼,在每一個換行的時候加上一個"\" #define MAX(X,Y) do { \ 語句1; \ 語句2; \ /* 注釋的寫法 */ \ } while(0) /* (no trailing ; ) */ \ 5.在大規模的開發過程中,特別是跨平臺和系統的軟件里,define最重要的功能是條件編譯。
#ifdef WINDOWS 。
。
#endif #ifdef LINUX 。
。
#endif 可以在編譯的時候通過#define設置編譯環境 6.取消宏 #undef 標識符 7.條件編譯 #ifdef XXX…(#else) … #endif 8.預定義宏 在C語言中收錄了一些有用的宏,這些宏是提供當前編譯信息的。 __LINE__ 被編譯文件的行數 (整型) __FILE__ 被編譯文件的名字 (字符型) __DATE__ 編譯日期 (字符型) __TIME__ 編譯時間 (字符型) __STDC__ 如果編譯器接受標準C,那么值為1. (整型) 通常在編譯的時候可以用這些預定義的宏來進行排錯,例如: 一般情況下,當出現除零的情況時編譯器是沒有提示的,可以自定義一個解決辦法。
#define CHECKZERO(divisor)\ if(divisor==0)\ printf("***ATTEMPT TO DIVIDE BY ZERO IN LINE %d of file %s ***\n",__LINE__,__FILE__);\ 引用方法 CHECKZERO(j); k=i/j;。
C語言,#define語句的用法
1.簡單的宏定義 格式:#define 標識符 替換列表 說明:替換列表可以是數,字符串字面量,標點符號,運算符,標識符,關鍵字,字符常量。
注意:替換列表是可以為空的 典型錯誤: #define N = 100 int a[N]; /*這樣會成為int a[= 100],這里會處理成為一種標識記號一樣*/ #define N 100; int a[N]; /*帶分號的定義會成為int a[100;],這是一種很常見的錯誤*/ #define pin (int*); pin a,b; int* a,b; /*本意是a和b都是int型指針,但是實際上變成int* a,b;a是int型指針,而b是int型變量。這是應該使用typedef來代替define,這樣a和b就都是int型指針了。
*/ 典型的使用方法: 使用宏定義可以自己根據自己的習慣來定義甚至改變C語言的語法習慣,例如: #define BEGIN { #define END } int main()BEGIN printf ("DEFINE----\n"); END 定義一個循環 #define LOOP for(;;) 重新定義數據類型 #define IT int 2.帶參數的宏 #define 標識符(x1,x2,x3。xn) 替換列表 (注意:x1,x2,x3..是宏的參數,標識符和其左括弧之間不能有空格) 使用方法: #define MAX(x,y) ((x)>(y)?(x):(y)) i=MAX(j+k,m-n); 替換為: i=MAX((j+k)>(m-n)?(j+k):(m-n)); #define SI_EX(n) ((n)%2==0) if(SI_EX(i)) i++; 替換為: if(SI_EX((i)%2==0)) 通過以上例子可以看出,標識符帶參數(X1,X2,X3。
..)在替換時會被替換列表(Y1,Y2,Y3。.)對應的替換,但是和順序無關。
3.宏的特殊單行定義 #define A(x) T_##x #define B(x) #@x #define C(x) #x x=1 替換為: A(1)------> T_1 (T_##x,##符號是記號粘黏符號,將前后的字符粘黏起來。) B(1)------> '1' ( #@x , #@ 符號會將宏的參數進行字符串字面量化,并且加‘’號) C(1)------> "1" ( #x ,#符號會將宏的參數進行字符串字面量化,并且加""號) *的多行定義 define可以替代多行的代碼,在每一個換行的時候加上一個"\" #define MAX(X,Y) do { \ 語句1; \ 語句2; \ /* 注釋的寫法 */ \ } while(0) /* (no trailing ; ) */ \ 5.在大規模的開發過程中,特別是跨平臺和系統的軟件里,define最重要的功能是條件編譯。
#ifdef WINDOWS 。
。
#endif #ifdef LINUX 。
。
#endif 可以在編譯的時候通過#define設置編譯環境 6.取消宏 #undef 標識符 7.條件編譯 #ifdef XXX…(#else) … #endif 8.預定義宏 在C語言中收錄了一些有用的宏,這些宏是提供當前編譯信息的。 __LINE__ 被編譯文件的行數 (整型) __FILE__ 被編譯文件的名字 (字符型) __DATE__ 編譯日期 (字符型) __TIME__ 編譯時間 (字符型) __STDC__ 如果編譯器接受標準C,那么值為1. (整型) 通常在編譯的時候可以用這些預定義的宏來進行排錯,例如: 一般情況下,當出現除零的情況時編譯器是沒有提示的,可以自定義一個解決辦法。
#define CHECKZERO(divisor)\ if(divisor==0)\ printf("***ATTEMPT TO DIVIDE BY ZERO IN LINE %d of file %s ***\n",__LINE__,__FILE__);\ 引用方法 CHECKZERO(j); k=i/j;。
關于define 語句
#define最后加不加分號跟define本身沒有關系,而取決于你使用的地方。
如:
#define MY_VALUE 5;
如果這樣用:
int x =MY_VALUE; //沒有問題,相當于int x=5;; 注意是兩個分號羅
但這樣用:if(x == MY_VALUE ) //這樣用有問題,因為其相當于:if(x==5;)
明白了么?實際#define 只是起替換的作用。
還有個比較經典的例子是。
#define TEST(x) (x)*(x)
那么 int x=5;
int y= TEST(++x); //y的值是多少? 36? 錯了,是 (++x)*(++x)=6*7=42
幫我看看這個define語句什么意思
一個概念性問題:#define是預處理命令,不是語句。
作為預處理命令,#define只能在一行內有效。因此需要用續行符\連接不同行。
預處理器進行斷行連接后,#define SetDispatchTableEntry(ui32Index, pfFunction) \ _SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(ui32Index), #ui32Index, (BridgeWrapperFunction)pfFunction, #pfFunction)變成#define SetDispatchTableEntry(ui32Index, pfFunction) _SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(ui32Index), #ui32Index, (BridgeWrapperFunction)pfFunction, #pfFunction)(這里顯示可能會有些問題,實際上是同一行。)這樣大段代碼可以分行寫,可讀性良好。
在斷行連接后,預處理器進行#define定義的宏的替換。帶參數的宏替換中有兩個特殊的操作符,#和##,前者可以把記號(token)轉換成字符串字面量,后者可以連接兩個記號。
對于#,接以上的例子:#define SetDispatchTableEntry(ui32Index, pfFunction) _SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(ui32Index), #ui32Index, (BridgeWrapperFunction)pfFunction, #pfFunction)對于SetDispatchTableEntry(123, foo),會替換成:_SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(123), "foo", (BridgeWrapperFunction)foo, "foo")。注意宏替換不檢查語義,如果有類型不匹配之類的編譯錯誤,之后才會提示出來。
對于##,例子如下:#define join(a, b) a##bjoin(x,y)被替換為xy。====[原創回答團]。
幫我看看這個define語句什么意思
一個概念性問題:#define是預處理命令,不是語句。
作為預處理命令,#define只能在一行內有效。因此需要用續行符\連接不同行。預處理器進行斷行連接后,
#define SetDispatchTableEntry(ui32Index, pfFunction) \
_SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(ui32Index), #ui32Index, (BridgeWrapperFunction)pfFunction, #pfFunction)
變成
#define SetDispatchTableEntry(ui32Index, pfFunction) _SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(ui32Index), #ui32Index, (BridgeWrapperFunction)pfFunction, #pfFunction)
(這里顯示可能會有些問題,實際上是同一行。)
這樣大段代碼可以分行寫,可讀性良好。
在斷行連接后,預處理器進行#define定義的宏的替換。帶參數的宏替換中有兩個特殊的操作符,#和##,前者可以把記號(token)轉換成字符串字面量,后者可以連接兩個記號。
對于#,接以上的例子:
#define SetDispatchTableEntry(ui32Index, pfFunction) _SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(ui32Index), #ui32Index, (BridgeWrapperFunction)pfFunction, #pfFunction)
對于SetDispatchTableEntry(123, foo),會替換成:
_SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(123), "foo", (BridgeWrapperFunction)foo, "foo")。注意宏替換不檢查語義,如果有類型不匹配之類的編譯錯誤,之后才會提示出來。
對于##,例子如下:
#define join(a, b) a##b
join(x,y)被替換為xy。
====
[原創回答團]
51單片機c語言 #define語句解釋
問題 1 : #define 的作用, 這是一個預處理語句.
何為預處理? 是指編譯器(也開發環境)在編譯之前的處理.
怎么處理呢? 其它就是字符串替換
例: #define PI 3.14
void main()
{
float area=0;
int radius=2;
area=PI*(radius*radius);
printf("%f",area);
}
預處理之后
void main()
{
float area=0;
int radius=2;
area=3.14*(radius*radius);
printf("%f",area);
}
其實就是字符串替換,所以 #define PI 3.14 不能加 ";" 不然變成 area=3.14;*(radius*radius);
這樣的話肯定出錯.
問題2: "\" 的作用,就是上下行的連接符,有可能是一行太長了,也有可以是為了好看,所有寫成多行
例:
#define PI 3.\
14
void _tmain()
{
float area=0;
int radius=2;
area=PI*(radius*radius);
printf("%f",area);
}
寫成這樣,也是可以的.