C++ 'multiple definition' 静态枚举类成员编译错误

标签 c++ enums static arduino

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

AutonomyHandler.cpp.o (symbol from plugin): In function AutonomyHandler::setup() const (.text+0x0): multiple definition of Module::AvailableCommandKeys ArduinoProject.cpp.o (symbol from plugin)*: (.text+0x0): first defined here

我在类定义中使用 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)

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...
}
<b><s>const Module::CmdKeys Module::AvailableCommandKeys[] = { Forward, Back };</s></b>

#endif

Module.cpp 如下所示:

#include "Module.h"

<b>const Module::CmdKeys Module::AvailableCommandKeys[] = { Forward, Back };</b>

// Other code...

关于C++ 'multiple definition' 静态枚举类成员编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47823215/

相关文章:

c++ - cout 一个 stringstream 但打印一个指针

c++ - 在函数中使用 asm,只用字节而不是指令名

c++ - 寻找最近的 XY 坐标

grails - Grails如何将枚举映射到数据库上的现有枚举

java - 如何在三元运算符中使用枚举检查两个条件?

java - 使用反射的静态方法

linux - 在 Linux 上链接 Log4cxx 的静态构建无法找到符号

c++ - 尝试在 C++ 中将字符串转换为 double 时遇到段错误

c++ - 为什么方法重载或枚举标志定义会触发 gcc7.2 编译器警告?

c# - .Net : Do static constructors get called when a constant is access?