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

时间:2018-01-06 08:37:36

标签: c++ compiler-errors definition clang++

我有3个文件:

main.cpp -

#include "test.hpp"

int main(void)
{
    test x;
    return (1);
}

test.hpp -

#ifndef TEST_HPP
#define TEST_HPP

class test
{
    static int a;

public:
    void    func(void);
};

#endif

test.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 个答案:

答案 0 :(得分:1)

  

只是将静态成员a初始化为0

不,这不仅仅是初始化,而是static data member的定义。如果没有它,您将看到链接错误,如您所见。

  

类体内的声明不是定义......

BTW:Constant static members * inline static members(因为C ++ 17)可以在类定义中定义。

* 请注意,当使用const非内联非constexpr静态数据成员时,仍需要命名空间作用域的定义,但它不能有初始化程序。 / SUP>