为什么需要在初始化时指定extern/static变量的类型?

Gan*_*rei 6 c++ static extern

我不明白在初始化时需要指定extern/static变量的类型.例如:

struct Test{
 static int i;
};
 Test::i = 2; //error
 int Test::i = 2; //ok
Run Code Online (Sandbox Code Playgroud)

编译器不知道我是int类型吗?它只是编译器的特殊性,或者为什么类型的规范,int"需要?

Mik*_*our 3

我不明白需要在初始化时指定外部/静态变量的类型。

因为语言设计者选择对变量声明和定义使用相同的语法。该语法包括类型名称。您是对的,在某些情况下,该类型名称是多余的。但是允许您省略它可能会有些混乱:它看起来像是一个赋值,而不是一个定义。

编译器不知道i是int类型吗?

仅当变量已被声明时。对于像这样的静态成员来说必须是这种情况,但对于全局变量则不一定。您可以在一个源文件中声明它:

extern int i;
Run Code Online (Sandbox Code Playgroud)

并在另一个中定义它

int i = 42;
Run Code Online (Sandbox Code Playgroud)

而不使声明可用于定义。