可以在 C 宏中賦值(即在宏中有左值)嗎?例如,我想1根據指定的位位置設定一個數字的位。這樣做可以嗎:
#define SET_BIT(data, pos) ((data) |= (1U << (pos)))
我已經對此進行了測驗并且它有效,但我覺得我在這里如履薄冰,如果我習慣了這樣的宏,我最終會遇到問題。
uj5u.com熱心網友回復:
一旦前處理器在代碼中完成了宏的擴展,宏將不存在。如果你有這樣的宣告
SET_BIT(some_data, some_pos);
然后它將被替換為
((some_data) |= (1U << (some_pos)));
在被決議和編譯的代碼中。
簡而言之,在宏中進行賦值是非常好的。
第一個SET_BIT_TO_VAL宏的問題:
#define SET_BIT_TO_VAL(data, pos, val) (CLEAR_BIT(data, pos); (data) |= (1U << (pos)))
是您將陳述句放在括號內,就像它們是運算式一樣。所以這不會建立。
在宏中對陳述句進行分組的常用方法是將它們包裝在一個do { ... } while(0)回圈中:
#define SET_BIT_TO_VAL(data, pos, val) \
do { \
CLEAR_BIT(data, pos); \
SET_BIT(data, pos); \
} while (0)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/525458.html
標籤:C宏
上一篇:使用int引數時回傳浮點值C
