在 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
未声明的结论还为时过早。在调试时注意这样的细节是一项有用的技能。
我想知道为什么给全局变量赋值会出错
#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
未声明的结论还为时过早。在调试时注意这样的细节是一项有用的技能。