我需要调用一个函数来调用宏函数来改变运行时的宏值。
此代码未编译:
#define MY_MACRO 32
#define SET_MY_MACRO_VAL(IS_TRUE)(MY_MACRO=(IS_TRUE)?16:U32)
在函数SET_MY_MACRO_VAL
> error: lvalue required as left operand of assignment
#define SET_MY_MACRO_VAL(IS_TRUE)(MY_MACRO=(IS_TRUE)?16:U32)
^
in expansion of macro 'SET_MY_MACRO_VAL'
SET_MY_MACRO_VAL(True);
^
答案 0 :(得分:2)
宏值在编译时由预处理器替换,并且在运行时不存在。
它不是一个变量,它只是一种使用文本作为值的方式" 32"。
如果你这样做:
#define MY_MACRO 32
#define SET_MY_MACRO_VAL(IS_TRUE)(MY_MACRO=(IS_TRUE)?16:U32)
它将扩展到此
#define MY_MACRO 32
#define SET_MY_MACRO_VAL(IS_TRUE)(32=(IS_TRUE)?16:U32)
你可以做的是使用#define
#ifdef SET_MACRO_VAL_32
#define MY_MACRO 32
#else
#define MY_MACRO 16
#endif
如果您愿意,可以使用条件宏
#if (IS_TRUE>0)
#define MY_MACRO 32
#else
#define MY_MACRO 16
#endif
编辑:
在C ++中,你不应该真的需要宏。您可以将template和/或constexpr变量用于编译时值。在C ++ 17中,您甚至可以使用constexpr if
。