在 C++ 中为全局变量赋值

assigning values to global variables in C++

我想知道为什么给全局变量赋值会出错

#include <iostream>

using namespace std;

int x = 5;
x = 3; // error: C++ requires a type specifier for all declarations

我不是在上面那行声明了吗?那么,让我们看看 x 是否存在;

int x = 5;
int x = 3; // error: redefinition of 'x'

好的,所以它确实同意定义了 x,但是类型是 "not yet" 一个 int。有人可以解释这种行为,你怎么称呼这种行为?它是怎么发生的?为什么要这样设计?

你只能在全局中定义和声明一个变量,但不能放置语句 并在全球范围内表达。

 int x = 5;
 x = 3; //expression 

和何时执行x=3?。但你可以通过

初始化它
 int x = 5;

没关系。

x = 3; 是一个 表达式语句 。表达式语句只能出现在块范围内,即在函数体内。

在命名空间作用域(全局作用域/文件作用域)你只能有declarations/definitions,而赋值不是。

 int x = 5;
 x = 3; // error: C++ requires a type specifier for all declarations

在你提到的第一种情况下,int x = 5;是一个变量定义和初始化过程。全局变量可以在函数外定义,但只能在函数内赋值。

int x = 5;
int x = 3; // error: redefinition of 'x'

x = 3前加上int后,变量x已经定义好了,它的数据类型也指定了。你不能重新定义它。

error: C++ requires a type specifier for all declarations

换句话说,您对在代码中的这个位置放什么的选择是有限的。在有效的选择中,声明最接近您所写的内容。如果你添加一个类型说明符,那么你就会有一个声明。这将是一个重新定义,但至少语法适合这部分代码。

这意味着赋值在代码中此时不是有效的选择。赋值(与使用 = 的定义相反)只能发生在函数内部。

看起来 clang 产生了特定的错误消息。您可能会发现 gcc 的含义更明确:error: 'x' does not name a type.

Haven't I just declared it on the line above?

使用未声明变量的错误消息看起来更像 error: use of undeclared identifier 'x'。您没有收到此消息,因此现在得出 x 未声明的结论还为时过早。在调试时注意这样的细节是一项有用的技能。