我正在使用C语言商业RTOS的套接字库来开发嵌入式项目。出于保密原因,我对某些周围的细节非常模糊,但只知道有一个完整的产品和RTOS堆栈。
在我正在处理的部分中,我有一个相当大但很简单的switch语句,它检查一个宏值并设置另一个宏值。案例值是RTOS标头中的套接字选项标志。当我用这个switch语句编译文件时,我得到一个错误,说“不止一次定义了case case”,指的是其中五个案例。
以下是一些使这个神秘的细节:
#ifndef HEADER
以避免多次包含。我在这里由一位资深开发人员经营,他和我一样神秘。有没有人知道可能导致这种情况的C解释的怪癖,或者任何地雷可能被忽视了?
谢谢!
答案 0 :(得分:7)
错误意味着宏被替换的值对于两个或更多宏来说是相同的,即使宏本身是不同的。
以下是重现此错误的简单方法:
#define ONE 42
#define TWO 42
int main(int argc, char* argv[]) {
int k = atoi(argv[1]);
switch (k) {
case ONE:
printf("ONE\n");
break;
case TWO:
printf("TWO\n");
break;
default:
printf("NONE\n");
break;
}
return 0;
}
即使宏被称为ONE
和TWO
,它们的值都是42,这会导致错误。
答案 1 :(得分:4)
除了点之外,所有对宏和头的引用都是(几乎):case constant defined more than once
意味着你的case
个语句中有多个求值为相同的值,因此编译器无法判断案件可供选择。
尝试打印出案例标签的实际值(它们都应该评估为整数,因此您可以printf
格式%d
)并查看是否可以找出原因宏具有重叠值。