首页 > 解决方案 > 变量只能全局“声明”,不能修改/(单独初始化)

问题描述

免责声明:

背景: 在回答另一个问题,我开始思考为什么OP不能修改public static变量。我考虑了一下,然后进一步减少了问题,我可以看到相同的效果,但不需要任何类或静态成员变量。

问题:那么下面的代码可以重现观察结果。

int global_n; // I know it can be initialized right away here also: int global_n = 1;
global_n = 2; // This does not compile in C++. In C it gives a warning about missing type-specifier

int main() {
    global_n = 2; // This does compile in both C/C++ of course
}
  1. 这让我想到了我的问题:全局变量(以及因此static变量/成员变量)只能在声明它们时直接初始化。但是任何后续修改只能发生在函数内部。正确的?

  2. 这有什么具体原因吗?

标签: c++cglobal-variables

解决方案


在函数之外,您不能有语句(即可执行的代码行),只有声明和定义。

在全局范围的情况下global_n = 2;,C90 有一个遗留特性,如果一个变量被声明为没有类型,那么它有一个默认类型int(C99 删除了这个特性并需要一个类型)。这就是在这种情况下发生的情况,这也是您收到有关缺少类型的警告的原因。

C++ 没有该规则,因此这显示为一个错误的函数之外的语句。


推荐阅读