присвоение значений глобальным переменным в C ++ - PullRequest
1 голос
/ 28 марта 2020

Мне интересно, почему присвоение значения глобальной переменной приведет к ошибке

#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 определен, но тип "еще не" int. Может кто-нибудь объяснить это поведение, как вы это называете? как это происходит? почему так задумано?

Ответы [ 4 ]

5 голосов
/ 28 марта 2020

x = 3; является оператором выражения . Операторы выражений могут появляться только в области блока, то есть внутри тела функции.

В области пространства имен (глобальная область / область файла) вы можете иметь только объявления / определения, назначение которых не является.

2 голосов
/ 28 марта 2020
 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 уже определена и ее тип данных Также будет указано. Вы не можете переопределить это.

1 голос
/ 28 марта 2020

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

Другими словами, ваш выбор для размещения в этом месте в коде ограничен. Среди действительных вариантов декларация наиболее близка к тому, что вы написали. Если вы добавите спецификатор типа, то у вас будет объявление. Это было бы переопределением, но по крайней мере синтаксис соответствует этой части кода.

Подразумевается, что присвоение не является допустимым выбором в этой точке кода. Назначения (в отличие от определений, использующих =) могут происходить только внутри функций.

Похоже, что clang выдает это конкретное сообщение об ошибке. Вы можете найти g cc менее двусмысленным: error: 'x' does not name a type.

Разве я не объявил это в строке выше?

Ошибка сообщение об использовании необъявленной переменной больше похоже на error: use of undeclared identifier 'x'. Вы не получили это сообщение, поэтому преждевременно делать вывод, что x не объявлено на данный момент. Замечать подобные детали - полезный навык при отладке.

1 голос
/ 28 марта 2020

вы только определяете и объявляете переменную в глобальном, но вы не можете поместить выражения и выражения в глобальное

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

и когда x=3 выполнено ?. но вы можете инициализировать его как

 int x = 5;

это нормально.

...