体系结构x86_64的C++重复符号递增枚举类型

C++ duplicate symbols for architecture x86_64..incrementing an enum type

本文关键字:符号 枚举 类型 x86 C++ 体系结构      更新时间:2023-10-16

我试图增加枚举类型,所以我以这种方式重载了运算符++:

 enum QuarterType{
            FIRST_QUARTER,
            SECOND_QUARTER,
            THIRD_QUARTER,
            FOURTH_QUARTER
        };

重载运算符++:

QuarterType& operator++(QuarterType& quarter){
    switch (quarter) {
        case FIRST_QUARTER:
            return quarter= SECOND_QUARTER;
        case SECOND_QUARTER:
            return quarter=THIRD_QUARTER;
        case THIRD_QUARTER:
            return quarter=FOURTH_QUARTER;
        case FOURTH_QUARTER:
            return quarter=FIRST_QUARTER;
    }
}

但当我编译项目时,我得到了错误:

duplicate symbol __ZN3mtmppERNS_11QuarterTypeE in:
    /Users/../Library/Developer/Xcode/DerivedData/mtm-crtygivbbxwmodgeasndvnjnpczt/Build/Intermediates/mtm.build/Debug/mtm.build/Objects-normal/x86_64/SecurityExample.o
    /Users/../Library/Developer/Xcode/DerivedData/mtm-crtygivbbxwmodgeasndvnjnpczt/Build/Intermediates/mtm.build/Debug/mtm.build/Objects-normal/x86_64/Quarters.o
duplicate symbol __ZN3mtmppERNS_11QuarterTypeE in:
    /Users/../Library/Developer/Xcode/DerivedData/mtm-crtygivbbxwmodgeasndvnjnpczt/Build/Intermediates/mtm.build/Debug/mtm.build/Objects-normal/x86_64/SecurityExample.o
    /Users/../Library/Developer/Xcode/DerivedData/mtm-crtygivbbxwmodgeasndvnjnpczt/Build/Intermediates/mtm.build/Debug/mtm.build/Objects-normal/x86_64/Security.o
ld: 2 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我该怎么修?增加枚举类型的正确方法或更好方法是什么?

您的运算符++似乎是从多个编译单元导出的。这可能会导致重复的符号错误,原因可能是头文件中运算符++的定义(而不仅仅是声明)。以下选项可用于解决问题:

  1. 在头文件中保留运算符++,但将其声明为inline
  2. 只保留头文件中的声明,并将定义移动到.cpp文件中

在回答第二个问题(关于增加枚举类型的更好方法)时,我认为在C++11中如下(clang编译器的-std=C++11选项):

enum class QuarterType : int {
    FIRST_QUARTER = 0,
    SECOND_QUARTER = 1,
    THIRD_QUARTER = 2,
    FOURTH_QUARTER = 3,
    TOTAL_QUARTERS = 4
};
inline QuarterType& operator++(QuarterType& quarter) {
    int currentQuarter = static_cast<int>(quarter);
    int nextQuarter = (currentQuarter+1)
        % static_cast<int>(QuarterType::TOTAL_QUARTERS);
    quarter = static_cast<QuarterType>(nextQuarter);
    return quarter;
}