如何在不导致链接器错误的情况下访问静态原子变量?

我将代码示例简化为以下示例:

#include <iostream>
#include <atomic>

class MyClass
{
public:
    static std::atomic_bool onOrOff;
};

std::atomic_bool onOrOff(false);

int main(int argc, const char * argv[]) {
    std::cout << "It is: " << (MyClass::onOrOff? "on": "off") << "\n";
    return 0;
}


这将导致以下链接器错误(MaxOS X 10.11,XCode 7.2):

Undefined symbols for architecture x86_64:
  "MyClass::onOrOff", 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)


注意:如果我删除main()访问中的行,则没有构建错误
MyClass::onOrOff,所以我认为这可以排除编译器选项的问题。

最佳答案

这个:

std::atomic_bool onOrOff(false);


应该:

std::atomic_bool MyClass::onOrOff(false);


就目前而言,您已经声明了两个不同的onOrOff变量,一个在类内部,一个在外部。而且只能分配一个存储空间。

10-07 23:40