You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在switch case中使用宏出现重复值编译错误的问题排查

Switch-Case使用宏出现重复值编译错误的解决方法

我尝试在switch case语句中使用宏的结果作为case分支的判断值,但编译代码时出现了“previously used here”和“duplicate value”错误。我确认宏的计算结果应该都是不同的,代码如下:

#define MACROTEST(a, b) (a<<2 + b)

switch (MACROTEST(input_string[0], input_string[1])) {
                            case (MACROTEST('a', 'c')):
                            {
                                /*some code*/
                            } break;
                            case(MACROTEST('g', 'e')):
                            {
                                /*some code*/
                            } break;
                            case(MACROTEST('s', 'e')):
                            {
                                /*some code*/
                            } break;
                            case(MACROTEST('g', 'm')):
                            {
                                /*some code*/
                            } break;
                            case(MACROTEST('s', 'b')):
                            {
                                /*some code*/
                            } break;
                            case(MACROTEST('g', 'r')):
                            {
                                /*some code*/
                            } break;
                            case(MACROTEST('s', 'r')):
                            {
                                /*some code*/
                            } break;
                            default: {
                                /*some code*/
                            }
}

问题出在宏定义的运算符优先级上。C语言中,加法运算符+的优先级高于移位运算符<<,所以你的宏MACROTEST(a, b) (a<<2 + b)会被编译器解析为:

a << (2 + b)

这和你预期的(a << 2) + b逻辑完全不同,导致不同的a、b组合可能计算出相同的结果,触发case值重复的编译错误。

修正方法是给宏中的每个运算步骤加上括号,确保优先级符合你的预期:

#define MACROTEST(a, b) (((a) << 2) + (b))

这样宏展开后会严格按照「先将a左移2位,再加上b」的逻辑执行,避免优先级混乱导致的重复值问题。

内容的提问来源于stack exchange,提问作者travellingMadness

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:51:15