C++静态枚举类成员的"多重定义"编译错误

C++ 'multiple definition' compile error with static enum class members

本文关键字:编译 错误 定义 静态 枚举 成员 C++      更新时间:2023-10-16

这是一个在Visual Studio中编译的Arduino项目(使用Visual Micro插件)。我收到以下错误:

autonomyhandler.cpp.o(插件的符号):在函数自动handler :: setup()const (.Text 0x0):模块的多重定义:: availablecommandkeys arduinoproject.cpp.o(插件的符号)*:(.text 0x0):首先在此处定义

我在类定义中使用枚举cmdkeys,我可以使用下面的代码行来获取可用的键,但是当我尝试使用它时,我会得到多个编译错误,如上所述,每个键我使用过的地方。

Module::AvailableCommandKeys

我的 Module.h 外观如下:

#ifndef _MODULE_h
#define _MODULE_h
class Module {
public:
    enum CmdKeys { Forward, Left, Back, Right, Stop };
    static const CmdKeys AvailableCommandKeys[2];
    // other definitions...
};
const Module::CmdKeys Module::AvailableCommandKeys[] = { Forward, Back };
#endif

有人知道发生了什么吗?我以前有这个问题,使成员非静态问题解决了问题,但我想保持这些枚举阵列静态。

自写这篇文章以来,我找到了答案,所以我认为我会发帖以帮助他人。

要解决问题,您只需要将静态成员的初始化从定义文件(.h)移动到声明文件(.cpp)

模块外观如下:

#ifndef _MODULE_h
#define _MODULE_h
class Module {
public:
    enum CmdKeys { Forward, Left, Back, Right, Stop };
    static const CmdKeys AvailableCommandKeys[2];
    // other definitions...
}
const Module::CmdKeys Module::AvailableCommandKeys[] = { Forward, Back };
#endif

Module.CPP 外观如下:

#include "Module.h"
const Module::CmdKeys Module::AvailableCommandKeys[] = { Forward, Back };
// Other code...

将行:const模块:: cmdkeys模块:: availablecommandkeys [] = {向前,返回};

在.cpp文件中。