2012-03-19 40 views
0

請參閱的C代碼下面的代碼片段:爲什麼布拉克的RVAL

PM_RAISE(retexn, exn) 
     do 
     { 
      retexn = (exn); 
      gVmGlobal.errFileId = __FILE_ID__; 
      gVmGlobal.errLineNum = (uint16_t)__LINE__; 
     } while (0) 

4號線,爲什麼exn用方括號括?

編輯(在回答IntermediateHacker)這裏是代碼的原始片段:

#if __DEBUG__ 
#define PM_RAISE(retexn, exn) \ 
     do \ 
     { \ 
      retexn = (exn); \ 
      gVmGlobal.errFileId = __FILE_ID__; \ 
      gVmGlobal.errLineNum = (uint16_t)__LINE__; \ 
     } while (0) 
#else 
#define PM_RAISE(retexn, exn) \ 
     retexn = (exn) 
#endif 
+2

這可能是一些宏觀或定義。顯示更多代碼。 – ApprenticeHacker 2012-03-19 11:40:02

+0

看起來像一個宏定義給我,所以你可以重新格式化它,包括'#define'嗎? – hroptatyr 2012-03-19 11:40:46

+0

這是一個宏嗎?你有沒有省略'#define'和\ s? – 2012-03-19 11:41:58

回答

3

這只是好的做法括號包裹宏參數。它沒有太大的幫助你的榜樣,但是說你有:

#define multiply(a, b) a * b 

,並用它:

multiply(4 + 3, 2) 

,將擴大到

4 + 3 * 2 

這顯然是不預期結果(3將首先乘以2)。

0

嗯,這是我的猜測,但我認爲這是爲了輸入一個算術表達式爲exn

這裏就是我的意思是:

/ * If I use: */ 
PM_RAISE(whatever, 18/9 + 5); 

/* It will generate */ 
whatever = (18/9 + 5); 

/* which is good. */ 

此外,這是很好的做法,包括在宏函數括號像@詹姆斯指出。

+0

如果沒有括號,它只是'無論= 18/9 + 5;'。那有什麼問題? – 2012-03-19 11:55:00