为了账号安全,请及时绑定邮箱和手机立即绑定

未定义的静态焦炭引用[]

未定义的静态焦炭引用[]

C++
浮云间 2019-07-27 09:15:05
未定义的静态焦炭引用[]我想要一个static const char我班上的数组。GCC抱怨说我应该用constexpr虽然现在它告诉我这是一个未定义的引用。如果我使数组成为非成员,那么它将编译。怎么一回事?// .hppstruct foo {   void bar();   static constexpr char baz[] = "quz";};// .cppvoid foo::bar() {   std::string str(baz); // undefined reference to baz}
查看完整描述

3 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

添加到CPP文件中:

constexpr char foo::baz[];

理由:你必须提供定义静态成员以及声明。声明和初始化器在类定义中,但是成员定义必须是分开的。



查看完整回答
反对 回复 2019-07-29
?
当年话下

TA贡献1890条经验 获得超9个赞

这确实是C+11中的一个缺陷-正如其他人所解释的那样,在C+11中,静态Conexpr成员变量与其他任何类型的Conexpr全局变量不同,具有外部链接,因此必须在某个地方显式定义。

还值得注意的是,在实践中,在使用优化进行编译时,您经常可以不使用定义来处理静态参数库成员变量,因为它们在所有的使用中都可能是内联的,但是如果您在没有优化的情况下编译,那么您的程序就会经常链接不上。这使得这成为一个非常常见的隐藏陷阱-您的程序在优化时编译得很好,但是一旦关闭优化(可能是为了调试),它就无法链接。

好消息是-这个缺陷在C+17中被修复了!但是,这个方法有点复杂:在C+17中,静态成员变量隐式内联..有内联应用于变量是C+17中的一个新概念,但它实际上意味着它们在任何地方都不需要明确的定义。




查看完整回答
反对 回复 2019-07-29
  • 3 回答
  • 0 关注
  • 287 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信