gpt4 book ai didi

c - 神秘的大小写常量定义多次错误

转载 作者:行者123 更新时间:2023-11-30 18:17:03 25 4
gpt4 key购买 nike

我正在使用 C 语言商业 RTOS 的套接字库开发一个嵌入式项目。出于保密原因,我将对一些周围的细节非常模糊,但只要知道涉及到完整的产品和 RTOS 堆栈即可。

在我正在处理的部分中,我有一个相当大但简单的 switch 语句,它检查一个宏值并设置另一个宏值。 case 值是 RTOS header 中的套接字选项标志。当我使用此 switch 语句编译文件时,我收到一条错误消息,指出“多次定义案例常量”,指的是其中五个案例。

以下是一些使这变得神秘的细节:

  1. 所有 header 均使用 #ifndef HEADER 封装,以避免多重包含。
  2. 宏值来自多个不同的 header ,但大小写是否产生此错误与原始 header 之间没有明显的相关性。
  3. 如果我注释掉单个定义或不明确包含该 header ,我会得到“未定义的标识符”,因此它显然与该文件和定义相关。
  4. 如果我在 Eclipse 中对宏进行“C/C++”搜索,它会列出该定义的两个实例,但两者都引用同一文件中的同一位置。

我已经由这里的一位高级开发人员运行了这个,他和我一样感到困惑。有谁知道可能导致这种情况的 C 解释的怪癖,或者任何地雷可能忽略了?

谢谢!

最佳答案

该错误意味着宏替换的值对于两个或多个宏来说是相同的,即使宏本身不同。

这是重现此错误的简单方法:

#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;
}

尽管宏名为 ONETWO,但它们的值都是 42,这会导致错误。

关于c - 神秘的大小写常量定义多次错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46551021/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com