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

时间:2017-10-03 18:22:21

标签: c embedded c-preprocessor

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

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

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

  1. 所有标头都包含#ifndef HEADER以避免多次包含。
  2. 宏值来自多个不同的标题,但是案例是否产生此错误与原始标题之间没有明显的相关性。
  3. 如果我注释掉单个定义或没有明确包含该标题,我会得到“未定义的标识符”,因此它明确地与该文件和定义相关联。
  4. 如果我在Eclipse中执行“C / C ++”搜索宏,它会列出定义的两个实例,但它们都引用同一文件中的相同位置。
  5. 我在这里由一位资深开发人员经营,他和我一样神秘。有没有人知道可能导致这种情况的C解释的怪癖,或者任何地雷可能被忽视了?

    谢谢!

2 个答案:

答案 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;
}

即使宏被称为ONETWO,它们的值都是42,这会导致错误。

答案 1 :(得分:4)

除了点之外,所有对宏和头的引用都是(几乎):case constant defined more than once意味着你的case个语句中有多个求值为相同的值,因此编译器无法判断案件可供选择。

尝试打印出案例标签的实际值(它们都应该评估为整数,因此您可以printf格式%d)并查看是否可以找出原因宏具有重叠值。