2014-01-12 4 views
-1

Статичные переменные в C++ внутренних переменных или внешних переменных? Или могут быть оба?Являются ли статические переменные внутренними или внешними в C++


PS: Мне кажется, что (не уверен, что это правильно):

  • Внутренние переменные присваиваются их значения во время компиляции.

  • Внешним переменным присваиваются их значения во время связи.

+2

Один вопрос на вопрос, пожалуйста. И оба, вероятно, были заданы раньше, так что некоторые поиски! –

+0

«Внутренние переменные или внешние». Я немного не понимаю, что вы имеете в виду. Внутренний/внешний по отношению к чему? Единицы компиляции, классы, ... ?? –

+0

@ πάνταῥεῖ Обновлено. – herohuyongtao

ответ

2

Инициализация зависит от типа статической переменной.

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

  2. Однако компилятор также может инициализировать переменные static во время выполнения, как правило, до выполнения main(). Но afaik, единственное ограничение состоит в том, что инициализация завершается, когда переменная используется вначале, и что статические переменные внутри единицы компиляции инициализируются в том порядке, в котором они записаны (в случае, если их инициализаторы зависят друг от друга).

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

В любом случае, статические переменные живут как минимум до main() выходов или exit(). Я уверен, что C++ также вызовет деструкторы перед завершением процесса, но я об этом не знаю.

2

В соответствии с С ++ Стандартного

3 Пространство имен рамки имен, имеющими (3.3.6) имеет внутреннюю связь, если она имя - переменная, функцию или шаблон функции, которая является явно объявлено статическим; или,

Что касается Вашего утверждения, что

PS: Я узнал, что • Внутренние переменные присваиваются их значения в время компиляции.

• Внешним переменным присваиваются их значения во время связи.

то это неправильно.

По-моему, вы пытаетесь перепутать два понятия: статическое время хранения и связь с программой.

Смежные вопросы