2015-10-19 106 views
2

我不完全確定這是什麼標題。但是,這是我第三次在C宏中看到這種現象。結尾帶有額外參數的宏?

#define sigemptyset(what) (*(what) = 0, 0) 
             ^
             eh? why not just ((*what) = 0) 

是否有一個額外的零點?例如,以我的理解(1,0,0,0)來評價爲1(第一項)。

+0

這是周圍的其他方法。逗號運算符評估爲_last_參數。在這種情況下爲零,表示無論輸入成功。 – doynax

+0

@doynax不完全:逗號運算符*計算所有操作數(子表達式),但結果是最後一個子表達式的結果。 – Kninnug

+0

我討厭逗號運算符,這再一次愚弄了我,所以這是upvote的藉口。我試圖找到一個upvote每天來平衡許多downvotes :) –

回答

4

逗號運算符產生其右操作數的值,而不是左操作數。

UPDATE:如在評論中指出由@Kninnugsigemptyset是指定爲返回一個int(規格:here)一POSIX功能。通過使用(*(what) = 0, 0)它保證宏產生一個int,即使*(what)是另一種類型比intsigemptyset參數應爲sigset_t類型)。

兩件事情,我想起你的宏定義: 如果有(void *) 0爲右,操作數,它可以模仿,它返回一個空指針的函數:

#define sigemptyset(what) (*(what) = 0, (void *) 0) 

int *p = sigemptyset(q); 

這可能是有用的如果你所有的其他sig函數都應該返回指針。

這使我想到的第二件事情是需要的時候用printf呼叫改變0允許調試:

#define sigemptyset(what) (*(what) = 0, printf("sigemptyset\n")) 

+1

OP(可能)指的是POSIX定義['sigemptyset']的實現(http://pubs.opengroup.org/onlinepubs/ 007908775/xsh/sigemptyset.html)操作,它必須返回一個(n'int')0.因此第二個表達式。 – Kninnug

+0

@Kninnug好點,我正在添加一個編輯。 – ouah

+0

如果你想把東西劃掉,也許你應該刪除它們... – skrrgwasme