我有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实际上没有任何意义。
为什么这会对编译产生影响?
答案 0 :(得分:1)
只是将静态成员a初始化为0
不,这不仅仅是初始化,而是static data member的定义。如果没有它,您将看到链接错误,如您所见。
类体内的声明不是定义......
BTW:Constant static members * 和inline static members(因为C ++ 17)可以在类定义中定义。
* 请注意,当使用const非内联非constexpr静态数据成员时,仍需要命名空间作用域的定义,但它不能有初始化程序。 / SUP>