我想知道为什么为全局变量赋值会导致错误
#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'
Okey,因此确实同意定义了x,但是类型为“还不是” int。有人可以解释这种行为,您怎么称呼这种行为?它是怎么发生的?为什么要这样设计?
答案 0 :(得分:5)
x = 3;
是表达式语句。表达式语句只能出现在块作用域内,即在函数体内。
在命名空间范围(全局范围/文件范围)中,您只能具有声明/定义,而没有分配。
答案 1 :(得分:2)
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'
在int
之前添加x = 3
之后,变量x已被定义,并且其数据类型也已指定。您无法重新定义它。
答案 2 :(得分:1)
您只能在全局变量中定义和声明变量,但不能放置语句 和全球表达。
int x = 5;
x = 3; //expression
并且何时执行x=3
?但您可以通过
int x = 5;
没关系。
答案 3 :(得分:1)
error: C++ requires a type specifier for all declarations
换句话说,在代码中放置在此位置的内容的选择是有限的。在有效选择中,声明最接近您编写的内容。如果添加类型说明符,则将有一个声明。这将是重新定义,但至少语法适合代码的这一部分。
含义是,在此刻,赋值不是有效的选择。赋值(与使用=
的定义相反)只能在函数内部进行。
好像clang产生了特定的错误消息。您可能会发现gcc不太含糊:error: 'x' does not name a type
。
我不是刚刚在上面的行中声明了吗?
使用未声明的变量的错误消息看起来更像error: use of undeclared identifier 'x'
。您没有收到此消息,因此断言此时未声明x
尚为时过早。注意这样的细节是调试时的有用技能。