C ++ 11中的静态结构在类编译时,为什么不链接?

时间:2015-07-10 12:35:46

标签: c++ c++11

我想提供一些对象的一次性配置。

此代码:

class Foo
{
  public:
    static struct Bar {
      bool a = true;
      int b = 69;
    } bar;
};

int main(int argc, char **argv)
{
  Foo::bar.a = false;
}

编译得很好:

$ g++ -c -std=gnu++11 main.cpp

但链接器抱怨缺少符号:

$ g++ main.o
Undefined symbols for architecture x86_64:
  "Foo::bar", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

为什么这不起作用?

实现同样目标的更好方法是什么?

1 个答案:

答案 0 :(得分:6)

变量仅在类定义中声明 ,因此您需要此静态变量的(单个)定义,与任何其他静态变量一样:

Foo::Bar Foo::bar;

Live demo。请记住,您的整个二进制文件中只能存在其中一个定义(无论是库还是可执行文件),因此该定义不能位于可以包含在多个翻译单元(源文件)中的标题中