我不完全確定這是什麼標題。但是,這是我第三次在C宏中看到這種現象。結尾帶有額外參數的宏?
#define sigemptyset(what) (*(what) = 0, 0)
^
eh? why not just ((*what) = 0)
是否有一個額外的零點?例如,以我的理解(1,0,0,0)來評價爲1(第一項)。
我不完全確定這是什麼標題。但是,這是我第三次在C宏中看到這種現象。結尾帶有額外參數的宏?
#define sigemptyset(what) (*(what) = 0, 0)
^
eh? why not just ((*what) = 0)
是否有一個額外的零點?例如,以我的理解(1,0,0,0)來評價爲1(第一項)。
逗號運算符產生其右操作數的值,而不是左操作數。
UPDATE:如在評論中指出由@Kninnug,sigemptyset
是指定爲返回一個int
(規格:here)一POSIX功能。通過使用(*(what) = 0, 0)
它保證宏產生一個int
,即使*(what)
是另一種類型比int
(sigemptyset
參數應爲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"))
OP(可能)指的是POSIX定義['sigemptyset']的實現(http://pubs.opengroup.org/onlinepubs/ 007908775/xsh/sigemptyset.html)操作,它必須返回一個(n'int')0.因此第二個表達式。 – Kninnug
@Kninnug好點,我正在添加一個編輯。 – ouah
如果你想把東西劃掉,也許你應該刪除它們... – skrrgwasme
這是周圍的其他方法。逗號運算符評估爲_last_參數。在這種情況下爲零,表示無論輸入成功。 – doynax
@doynax不完全:逗號運算符*計算所有操作數(子表達式),但結果是最後一個子表達式的結果。 – Kninnug
我討厭逗號運算符,這再一次愚弄了我,所以這是upvote的藉口。我試圖找到一個upvote每天來平衡許多downvotes :) –