關于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。====[原創回答團]。
在C語言中define是不是關鍵字
在C語言中define不是關鍵字。define是編譯器的預編譯指令,是編譯器實現的,不是C語言的內容。
C語言中的關鍵字及意義如下:
auto 局部變量(自動儲存)
break無條件退出程序最內層循環
case switch語句中選擇項
char單字節整型數據
const定義不可更改的常量值
continue中斷本次循環,并轉向下一次循環
default switch語句中的默認選擇項
do 用于構成do。..while循環語句
double定義雙精度浮點型數據
else構成if。..else選擇程序結構
enum枚舉
extern在其它程序模塊中說明了全局變量
float定義單精度浮點型數據
for構成for循環語句
goto構成goto轉移結構
if構成if。.else選擇結構
int基本整型數據
long長整型數據
registerCPU內部寄存的變量
return用于返回函數的返回值
short短整型數據
signed有符號數
sizoef計算表達式或數據類型的占用字節數
static定義靜態變量
struct定義結構類型數據
switch構成switch選擇結構
typedef重新定義數據類型
union聯合類型數據
unsigned定義無符號數據
void定義無類型數據
volatile該變量在程序中執行中可被隱含地改變
while用于構成do。while或while循環結構