C语言 在开关情况下使用宏时复制值

kxe2p93d  于 2023-02-15  发布在  其他
关注(0)|答案(1)|浏览(146)

我尝试创建一个切换大小写,其中大小写是宏的结果,但在编译代码时,我收到错误“以前在此使用”和“重复值”
我不明白从什么时候开始我确信宏的结果总是不同的。
下面是我试用的代码

#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*/
                            }

有人知道问题出在哪里吗?

myzjeezk

myzjeezk1#

这个宏写得很马虎。
1.您很可能希望它像这样工作?((a<<2) + b)它不是这样的,因为二进制加法的优先级高于移位。
1.正如任何一本C编程书籍中所讲的那样,必须始终用括号将类似函数的宏参数括起来,以避免类似的优先级问题。
所以我认为你要找的宏观是:

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

相关问题