Инициализация внешней переменной - PullRequest
0 голосов
/ 01 июня 2018

У меня есть 3 файла, как указано ниже:

//1.hpp
extern int a;
//1.cpp
#include "1.hpp"
int a = 44;
//2.cpp
#include <iostream>

using namespace std;

extern int a;
int main()
{
    cout << endl << a;
    return 0;
}

Вышеприведенная программа выдала 44 в качестве вывода.Я хотел спросить, гарантировано ли, что выход всегда будет равен 44, поскольку для меня не очевидно, какая именно последовательность работает в этой программе, т. Е. Правильно ли говорить, что инициализация «a» уже произошла до того, как он был использован внутриmain функция?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Существует три типа символов компоновщика

  • Глобальные символы
  • Внешние символы
  • Локальные символы.

И как компоновщик разрешает эти символы, вот некоторые моменты.

  • Сильные символы (имена функций, инициализированные глобальные переменные)
  • Слабые символы (неинициализированные глобальные переменные)

Теперь правила разрешения символов:

Правило 1: Не допускается использование нескольких сильных символов

Правило 2: При наличии сильного символаи несколько слабых символов, выберите сильный символ

Правило 3: Если имеется несколько слабых символов, выберите произвольный

Вывод: Итакпоэтому значение var a = 44 , поскольку оно инициализируется глобально, а все глобальные символы инициализируются перед выполнением main ().

0 голосов
/ 01 июня 2018

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

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

И все объекты, объявленные в области пространства имен (включая глобальное пространство имен), имеют статическая продолжительность хранения .

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