Область переменных в C ++? - PullRequest
0 голосов
/ 07 ноября 2011

В c ++ любые переменные, объявленные в main, будут доступны по всему main, верно? Я имею в виду, что если переменные были объявлены в цикле try, будут ли они по-прежнему доступны в main? Поскольку я объявил несколько переменных в цикле try в main, но если я использую их в любой другой части main за пределами цикла try, я получаю ошибку «не было объявлено в этой области»

Я, к сожалению, не могу опубликовать свой фактический код, но это в основном то, что я делаю

int main()
{
   try 
   {
     int number = 0;
   }

   catch (...)
   {
     cout <<"Error";
   }

   number ++;
   cout <<number;

   return 0;
}

Я бы в основном получил ошибку в строках 13 и 14, говоря, что число не было объявлено в этой области.

Ответы [ 4 ]

7 голосов
/ 07 ноября 2011

Область действия number ограничена блоком try.Вытащите это объявление в область действия main, чтобы получить доступ к переменной после блока try:

int main()
{
   int number = 0;
   try 
   {
     // do something...
   }

   catch (...)
   {
     cout <<"Error";
   }

   number ++;
   cout <<number;

   return 0;
}
6 голосов
/ 07 ноября 2011

Локальные переменные в C ++ имеют область видимости блока, а не область функции. Переменная number находится только в области видимости внутри блока try.

Чтобы сделать это, у вас есть (как минимум) два варианта:

  1. Сделать переменную доступной в области действия функции (не так хорошо):

    int main() {
        int number;
        try {
            number = <some possibly-exception-throwing call>;
        } catch (...) {
            cout << "Error\n";
            return 0;
        }
        ++number;
        cout << number;
    }
    
  2. Поместите все использование переменной в область видимости (намного лучше):

    int main() {
        try {
            int number = <some possibly-exception-throwing call>;
            ++number;
            cout << number;
        } catch (...) {
            cout << "Error\n";
        }
    }
    

Я решительно поддерживаю второй вариант по нескольким причинам:

  1. Вам не нужно явно обрабатывать случай, когда переменная не была правильно инициализирована.
  2. Нет риска случайного использования неинициализированной переменной. Фактически, ваш код мог бы показывать именно эту ошибку, если бы локальные объекты C ++ имели область действия функции (предполагая, что намерение было инициализировать number чем-то более интересным, чем константа).
  3. Хранит декларацию и инициализацию вместе.

Приложение: для main(), в частности, существует третий вариант:

    int main() try {
        ...
    } catch {
        cout << "Error\n";
    }

Это оборачивает всю программу, включая статические инициализаторы за пределами main(), в попытку ... поймать.

1 голос
/ 07 ноября 2011

В c ++ любые переменные, объявленные в main, будут доступны по всему main right?

Нет!

Область действия каждой переменной - это блок, в котором определена переменнаяи его вложенные блоки: {}

Вы должны поместить int number; вне блока try{}.


Подробнее о здесь :

Область действия переменных Все переменные, которые мы намереваемся использовать в программе, должны быть объявлены с указателем типа в более ранней точке кода, как мы это делали в предыдущем коде в начале телаФункция main, когда мы объявили, что a, b и result имеют тип int.

Переменная может иметь глобальную или локальную область видимости.Глобальная переменная - это переменная, объявленная в основном тексте исходного кода вне всех функций, тогда как локальная переменная - это переменная, объявленная в теле функции или блока.

enter image description here

Глобальные переменные можно ссылаться из любого места в коде, даже внутри функций, всякий раз, когда это происходит после объявления.

Область действия локальных переменных ограничена блоком, заключенным в фигурные скобки ({}), где они находятсяобъявлен.Например, если они объявлены в начале тела функции (как в функции main), их область видимости находится между точкой ее объявления и концом этой функции.В приведенном выше примере это означает, что если в дополнение к main существует другая функция, локальные переменные, объявленные в main, не могут быть доступны из другой функции, и наоборот.

0 голосов
/ 07 ноября 2011

Это нормально; каждый { ... } блок отмечает новую область, и переменные, объявленные внутри него, являются локальными для него. Если вы хотите, чтобы number был доступен во всех main, объявите его вне блока try.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...