我有以下宏:
#define HEX 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
#define BITS 0x01
#define ADD_FLAGS(a, b, c, d, e, f, g, h) \
a, b | BITS, c, d, e, f, g, h
我在某處使用它來創建一個位元組陣列{ADD_FLAGS(HEX)}。這不起作用。HEX被解釋為單個引數ADD_FLAGS,我得到了引數太少的錯誤。
我還嘗試了以下變體,但沒有成功:
#define EXPAND(x) x
#define ADD_FL(a, b, c, d, e, f, g, h) \
a, b | BITS, c, d, e, f, g, h
#define ADD_FLAGS(...) ADD_FL EXPAND((__VA_ARGS__))
##################### other variant
#define ADD_FLAGS(...) EXPAND(ADD_FL (__VA_ARGS__))
uj5u.com熱心網友回復:
除了強制性的“避免宏”之外,您只需要包裝ADD_FLAGS另一個宏。
將其重命名為其他名稱,例如ADD_FLAGS_,并添加
#define ADD_FLAGS(...) ADD_FLAGS_(__VA_ARGS__)
這適用于 GCC 和 Clang。在 MSVC 中,這僅適用于新的前處理器(/Zc:preprocessor標志)。
不知道如何用舊的 MSVC 前處理器來做,但由于它是出了名的錯誤,如果可能的話,我會避免支持它。
uj5u.com熱心網友回復:
我建議您謹慎使用宏。這是一個示例片段,它完全符合宏正在做的事情,但在我看來它更合理一些。
template<typename ... Ts>
constexpr auto add_flags(Ts && ... args){
std::array flags{std::forward<Ts>(args)...};
constexpr int bits = 0x01;
// flags[some_idx] |= bits;
return flags;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340744.html
標籤:C
上一篇:優化之間的C 程式行為不同
