c++ - 在宏函数 C++ 中设置宏变量值

标签 c++ macros

我需要调用一个函数,该函数调用宏函数来在运行时更改宏值。

此代码未编译:

#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);
         ^

最佳答案

宏值在编译前被预处理器替换,并且在运行时不存在。

它不是一个变量,它只是使用文本表示值“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++ 中,您实际上并不需要宏。您可以使用模板和/或 constexpr 变量作为编译时值。在 C++17 中,您甚至可以使用 constexpr if

关于c++ - 在宏函数 C++ 中设置宏变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50696132/

相关文章:

java - 使用捆绑资源创建 JavaVM

c++ - 使库可从 GO 中的其他语言使用

c++ - 使用 BFS 了解树遍历的时间复杂度

vba - Excel VBA - 将带有文本和格式的新列添加到多个工作表

macros - 我的宏在 Common Lisp 中的部分应用有问题

当类模板 "*"包装在宏中时,C++ 的参数太少

c++ - 动态查找/dev/input/event*中的鼠标事件id

使用 stringstream 的 C++ iostream 损坏

c++ - 对 C 宏的 undefined reference ,但在我定义它时会出现重新定义的错误

c - 如何防止 C 预处理器宏扩展为重复值?