为什么需要在初始化时指定 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
initializer
opt ;
我省略了很多细节,但这是基本思想:文件范围内的内容必须是声明,变量声明必须以类型名称开头。
开头没有类型名称,您有一个简单的赋值语句——但这些语句只允许在函数内部使用,而不是在文件范围内使用,就像您在此处尝试这样做的那样。
这个"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';
}
这有点令人费解,但底线是:没有提到类型可能会破坏内容。
其他答案基本上相当于与其他情况下出现的变量定义保持一致 - 这是可取的,但不是决定反对问题中提出的简化的合理技术驱动因素。当然,它可能不够简化,或者可能被视为更多的混淆,阻止它被认真考虑标准化。
我不明白在初始化时需要指定 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
initializer
opt ;
我省略了很多细节,但这是基本思想:文件范围内的内容必须是声明,变量声明必须以类型名称开头。
开头没有类型名称,您有一个简单的赋值语句——但这些语句只允许在函数内部使用,而不是在文件范围内使用,就像您在此处尝试这样做的那样。
这个"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';
}
这有点令人费解,但底线是:没有提到类型可能会破坏内容。
其他答案基本上相当于与其他情况下出现的变量定义保持一致 - 这是可取的,但不是决定反对问题中提出的简化的合理技术驱动因素。当然,它可能不够简化,或者可能被视为更多的混淆,阻止它被认真考虑标准化。