代码之家  ›  专栏  ›  技术社区  ›  Theo Walton

初始化静态成员使编译工作正常。。。但为什么

  •  2
  • Theo Walton  · 技术社区  · 7 年前

    我有3个文件:

    主要的cpp公司-

    #include "test.hpp"
    
    int main(void)
    {
        test x;
        return (1);
    }
    

    测验水电站-

    #ifndef TEST_HPP
    #define TEST_HPP
    
    class test
    {
        static int a;
    
    public:
        void    func(void);
    };
    
    #endif
    

    测验cpp公司-

    #include "test.hpp"
    
    int test::a = 0; // removing this line makes compilation fail
    
    void    test::func(void)
    {
        a--;
    }
    

    我编译时使用: clang++ *.cpp -I . ,只有这3个文件在我的目录中。

    编译失败消息为:

    Undefined symbols for architecture x86_64:
      "test::a", referenced from:
          test::func() in test-8bbfc4.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    

    根据我的理解:

    int   test::a = 0; // removing this line makes compilation fail
    

    正在初始化静态成员 a 到0,因为它已经是0,实际上没有任何意义。

    为什么这会对汇编产生影响?

    1 回复  |  直到 7 年前
        1
  •  1
  •   songyuanyao    7 年前

    正在将静态成员a初始化为0

    不,这不仅仅是初始化,这是 static data member . 没有它,您将看到链接错误。

    类主体内的声明不是定义。。。

    顺便说一句: Constant static members * inline static members (因为C++17)可以在类定义中定义。


    * 请注意,当使用const non-inline non-constexpr静态数据成员时,仍然需要在命名空间范围中定义,但它不能有初始值设定项。