C语言中switch-case使用宏相关case分支报错问题求助
你的代码报错原因及修复方案
嘿,我来帮你拆解这段代码的问题所在!
首先,你遇到的核心问题是switch语句的case标签必须是编译期常量,而你代码里写的case ar[i]完全不符合这个规则。
为什么会报错?
C语言明确规定:switch的case后面必须跟一个常量表达式——也就是在编译阶段就能确定具体值的表达式,比如直接写数字2、3,或者用#define定义的宏(宏会在预编译阶段被替换成具体数值,属于编译期常量)。
但你这里用的ar[i]是数组元素,哪怕数组被const修饰,它本质上还是运行时才能访问的变量值。编译器在编译阶段没法提前预知循环到每个i时ar[i]的具体值(哪怕我们肉眼能看出是固定的2、3、4,但语法规则不允许这种“看起来是常量”的变量作为case标签),所以会直接抛出编译错误。
怎么修复?
根据你的需求,有两种常见的修复方式:
方式一:替换成if判断(更贴合你的原始逻辑)
if判断允许用变量作为条件,完全适配你“判断循环变量i是否等于对应数组元素”的需求:
#include <stdio.h> #define h1 2 #define h2 3 #define h3 4 const int ar[] = {h1,h2,h3}; int main(int argc, char const *argv[]) { for (size_t i = 0; i < 3; i++) { if (i == ar[i]) { printf("yes!!!!!!!!"); } } return 0; }
方式二:改用编译期常量作为case标签(如果一定要用switch)
直接把宏定义的常量写在case后面,符合switch的语法要求:
#include <stdio.h> #define h1 2 #define h2 3 #define h3 4 const int ar[] = {h1,h2,h3}; int main(int argc, char const *argv[]) { for (size_t i = 0; i < 3; i++) { switch (i) { case h1: case h2: case h3: printf("yes!!!!!!!!"); break; } } return 0; }
这样修改后代码就能正常编译运行啦!
内容的提问来源于stack exchange,提问作者Saptarshi Sahoo
相关产品推荐
相关产品推荐

