神秘案例常量不止一次定义错误

Mic*_*ell -1 c embedded c-preprocessor

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

在我正在研究的部分中,我有一个相当大但很简单的switch语句,它检查一个宏值并设置另一个宏值.案例值是RTOS标头中的套接字选项标志.当我用这个switch语句编译文件时,我得到一个错误,说"不止一次定义了case case",指的是其中五个案例.

以下是一些让这个神秘的细节:

  1. 包裹所有标题#ifndef HEADER以避免多个包含.
  2. 宏值来自多个不同的标题,但是案例是否产生此错误与原始标题之间没有明显的相关性.
  3. 如果我注释掉单个定义或者没有明确地包含该标题,我会得到"未定义的标识符",因此它明确地与该文件和定义相关联.
  4. 如果我在Eclipse中执行"C/C++"搜索宏,它会列出定义的两个实例,但它们都引用同一文件中的相同位置.

我是由一位资深开发人员在这里经营的,他和我一样神秘.有没有人知道可能导致这种情况的C解释的怪癖,或者任何地雷可能被忽视了?

谢谢!

das*_*ght 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;
}
Run Code Online (Sandbox Code Playgroud)

尽管宏被称为ONE并且TWO,它们的值都是42,这会导致错误.