2014-03-03 34 views
4

所以我在AD0_ADMD_CT這種不知道什麼時候是使用使用圓括號中定義的預處理程序語句

#define xxx (yyy) 

VS

#define xxx yyy 

我的項目包括有自己的定義文件,如果我想重新定義他們需要在定義中使用(AD0_ADMD_CT)還是AD0_ADMD_CT?

AD0_ADMD_CT被定義爲

#define AD1_ADMD_CT  (IO_AD1.ADMD.bit.CT) 

因此,這將是要麼

#define AD0_COMPARETIME  (AD0_ADMD_CT) 

#define AD0_COMPARETIME  AD0_ADMD_CT 

回答

5

兩者沒有區別。在第一種情況下,XXX被替換爲yyy,而(yyy)是第二種情況。使用括號的約定是爲了避免可能發生的邏輯錯誤。例如,你定義另外的功能:

#define f(N) N+N 
int a = f(5)*f(5) 

預期值是10 * 10 = 100,但輸出是35,因爲在編譯時是變

int a = 5+5*5+5,所以使用操作者偏好規則,輸出變化。

所以括號避免了這些類型的錯誤。

3

通過添加括號,則迫使括號內的參數是在宏觀機構的其他部分之前進行評估,所以如果你有

#define MULT(x, y) (x) * (y) 
// now MULT(3 + 2, 4 + 2) will expand to (3 + 2) * (4 + 2) 

它似乎不影響您目前的情況,除非您的宏有更多的情況。

2

如果您的宏中有操作員,這一點非常重要。例如:

#define ADD(x,y) x + y 
ADD(1,2) * 3 /* Should be 9, is 7 */ 

應該是:

#define ADD(x,y) (x + y) 
ADD(1,2) * 3 /* 7 */ 

這些優先級問題,也適用於參數中,@Gi喬說,和需要被包裹在括號的優先級。

然而,對於一個宏,如:

#define MAGICNUM 3 

沒關係。

0

要記住一個重要的事情是預處理器只是擴展宏。例如,如果您有下面幾行:

#define AD0_COMPARETIME_1 (AD0_ADMD_CT) 
#define AD0_COMPARETIME_2 AD0_ADMD_CT 

num_1 = AD0_COMPARETIME_1; 
num_2 = AD0_COMPARETIME_2; 

,第一膨脹後你有這樣的:

num_1 = (AD0_ADMD_CT); 
num_2 = AD0_ADMD_CT; 

與第二膨脹後,你有這樣的:

num_1 = ((IO_AD1.ADMD.bit.CT)); 
num_2 = (IO_AD1.ADMD.bit.CT); 

正如其他答案中所述,擴展表達式時可能會出現問題。