這樣做有缺點嗎:
#define get_and_mark(name, b) get_val(name, &b), b = b | 0x80
而不是這個:
#define get_and_mark(name, b) \
do { \
get_val(name, &b); \
b = b | 0x80; \
} while (0)
據我所知,逗號也應該可以安全地用于回圈、分支等。但真的如此嗎?
uj5u.com熱心網友回復:
如果像格哈德 所說的那樣修好:
#define get_and_mark(name, b) (get_val(name, &(b)), (b) = (b) | 0x80)
那么第一個版本可以用在一個運算式中,例如:
if (get_and_mark(name, b) != 0)
但第二個不能。你想要哪種語意?您是否希望條件中的呼叫if成為編譯時錯誤?
請注意,由于b在擴展中多次提及,您不能使用get_and_mark(name, b[i ]). 另外,請注意,您可以(b) |= 0x80在兩種變體中用于分配:
#define get_and_mark(name, b) (get_val(name, &(b)), (b) |= 0x80)
#define get_and_mark(name, b) \
do { \
get_val(name, &(b)); \
(b) |= 0x80; \
} while (0)
您可以在第二個變體中使用逗號運算子——盡管沒有必要這樣做。
為什么不使用行內函式?
static inline int get_and_mark(const char *name, int *b)
{
get_val(name, b);
return (*b |= 0x80);
}
你會用get_and_mark(name, &b)? (顯然,我猜測 的型別name,但如果我錯了,修復它很容易。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/524600.html
標籤:C宏
上一篇:C警告:傳遞'sprintf'的引數1的指標目標在符號上不同
下一篇:如何通過SWIG使用單個C函式?
