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

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

我想要一个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}


浮云间
浏览 300回答 3
3回答

MYYA

添加到CPP文件中:constexpr char foo::baz[];理由:你必须提供定义静态成员以及声明。声明和初始化器在类定义中,但是成员定义必须是分开的。

当年话下

这确实是C+11中的一个缺陷-正如其他人所解释的那样,在C+11中,静态Conexpr成员变量与其他任何类型的Conexpr全局变量不同,具有外部链接,因此必须在某个地方显式定义。还值得注意的是,在实践中,在使用优化进行编译时,您经常可以不使用定义来处理静态参数库成员变量,因为它们在所有的使用中都可能是内联的,但是如果您在没有优化的情况下编译,那么您的程序就会经常链接不上。这使得这成为一个非常常见的隐藏陷阱-您的程序在优化时编译得很好,但是一旦关闭优化(可能是为了调试),它就无法链接。好消息是-这个缺陷在C+17中被修复了!但是,这个方法有点复杂:在C+17中,静态成员变量隐式内联..有内联应用于变量是C+17中的一个新概念,但它实际上意味着它们在任何地方都不需要明确的定义。
打开App,查看更多内容
随时随地看视频慕课网APP