神秘的case常量定义了多次错误
我正在使用C语言商用RTOS的socket库开发一个嵌入式项目。出于保密的原因,我将对周围的一些细节非常含糊,但我只知道其中涉及到完整的产品和RTOS堆栈 在我正在研究的部分中,我有一个相当大但简单的switch语句,它检查一个宏值并设置另一个宏值。案例值是RTOS标头中的套接字选项标志。当我用这个switch语句编译文件时,我得到一个错误,它说“case constant defined over-one次”,指的是其中的五种情况 以下是一些细节,让这一切变得神秘:神秘的case常量定义了多次错误,c,embedded,c-preprocessor,C,Embedded,C Preprocessor,我正在使用C语言商用RTOS的socket库开发一个嵌入式项目。出于保密的原因,我将对周围的一些细节非常含糊,但我只知道其中涉及到完整的产品和RTOS堆栈 在我正在研究的部分中,我有一个相当大但简单的switch语句,它检查一个宏值并设置另一个宏值。案例值是RTOS标头中的套接字选项标志。当我用这个switch语句编译文件时,我得到一个错误,它说“case constant defined over-one次”,指的是其中的五种情况 以下是一些细节,让这一切变得神秘: 所有标题都用#ifndef
#ifndef标题
包装,以避免多个包含内容谢谢 该错误意味着两个或多个宏的替换值相同,即使宏本身是不同的 下面是重现此错误的简单方法:
#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,这导致了错误。所有对宏和头的引用(几乎)都是除此之外的一点:case常量被多次定义
意味着您的case
语句中有多个计算为相同的值,因此,编译器无法区分要选择的大小写
尝试打印案例标签的实际值(它们都应计算为整数,这样您就可以使用
%d
格式printf
打印它们),看看是否可以找出某些宏具有重叠值的原因。这意味着在宏替换和扩展之后,存在具有相同整数值的大小写标签。识别案例标签冲突,并了解宏是如何展开的。如果不发布代码和相关宏,我们无法提供比我更大的帮助。保密原因无关紧要-如果没有一个标签,除了猜测之外,你不太可能得到太多帮助。出于保密原因,你是含糊不清的。问题是,这使得你的问题如此模糊,以至于没有人能明智地帮助你。试着创建一个与你实际的“机密”代码无关,但显示出同样问题的代码。尽管它令人尴尬,但我认为@PaulOgilvie解决了它。事实证明,RTO的设计者并不太担心他们的参数被一起使用。