静态constexpr多维std::array赋值触发undefined reference链接错误如何解决
问题原因
这是C++11/14标准的规则限制导致的链接错误:
- 静态constexpr类成员即使在类内提供了初始化器,也不代表自动拥有外部定义。
- 当你对该成员进行odr使用(即需要获取该成员的内存地址,比如你对二维数组取下标获取子数组左值、用于赋值运算符的左值引用参数,就属于odr使用)时,必须在类外额外提供该静态成员的定义,否则链接器会找不到对应符号。
你定义的一维constexpr数组成员能正常编译,是因为GCC4.8.2对小型constexpr对象做了常量折叠优化,直接把值嵌入到了赋值语句中,没有触发odr使用,因此不需要外部定义也能编译通过;而二维数组的使用场景没有被优化覆盖,触发了odr使用,因此报链接错误。
解决方案
方案1:升级到C++17及以上标准(推荐)
C17开始,静态constexpr类成员默认是inline属性,类内初始化后不需要额外提供类外定义,只需要在你的编译选项中添加-std=c++17(或更高版本比如c20)即可解决问题。
方案2:C++11/14环境下补充类外定义
在Constant_Value.cpp文件的全局作用域中,添加以下两行代码即可,不需要重复写初始化值(类内已经提供了初始化内容):
constexpr std::array<std::array<Actuator::Action, NUMBER_OF_RELAYS>, NUMBER_OF_ACTUATORS> Constant_Value::m_actuator_relay_default_config; constexpr std::array<std::array<Actuator::Action, NUMBER_OF_LEDS>, NUMBER_OF_ACTUATORS> Constant_Value::m_actuator_led_default_config;
内容的提问来源于stack exchange,提问作者ali tavakoli
相关产品推荐
相关产品推荐

