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

Why do you need to specify type of extern/ static variable at initialization?

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

struct Test{
 static int i;
};
 Test::i = 2; //error
 int Test::i = 2; //ok

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

I do not understand the need to specify the type of an extern/static variable at initialization.

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

Doesn't the compiler know that i is of type int?

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

extern int i;

并在另一个

中定义
int i = 42;

没有使声明可用于定义。

这是基本语法问题。

一个C++文件由一系列声明组成。变量声明的基本语法类似于:

type identifier initializeropt ;

我省略了很多细节,但这是基本思想:文件范围内的内容必须是声明,变量声明必须以类型名称开头。

开头没有类型名称,您有一个简单的赋值语句——但这些语句只允许在函数内部使用,而不是在文件范围内使用,就像您在此处尝试这样做的那样。

这个"limitation"可以简化为简单的语法:语句

Test::i = 2; //error

是由赋值表达式组成的表达式语句。这实际上从未被解析为声明,无论实体 Test::i 是什么,调整语法以涵盖这一点将极其复杂并且没有任何好处。

这是一个有效的、可运行的代码示例,如果在整数 N::X::i 的定义中未指定类型,该代码将变得不明确,因为可以使用消除歧义的 struct结构,但没有什么等同于强制 int X::i 定义与您建议的语法下的 struct 不匹配。

#include <iostream>

namespace N
{
  struct X
  {
    static int i;
    struct i { int n_; };
  };
}

int n = 2;

namespace N
{
  int X::i (n);   // take int out and under current C++ rules
                  // it will be equivalent to the next line
                  // (which is equivalent to struct X::i n; btw)
  struct X::i (n); // but under your proposed rules, ambiguous
}

int main()
{
    std::cout << N::n.n_ << ' ' << N::X::i << '\n';
}

这有点令人费解,但底线是:没有提到类型可能会破坏内容。

其他答案基本上相当于与其他情况下出现的变量定义保持一致 - 这是可取的,但不是决定反对问题中提出的简化的合理技术驱动因素。当然,它可能不够简化,或者可能被视为更多的混淆,阻止它被认真考虑标准化。