Порядок инициализации встроенных переменных

Предположим, у меня есть следующие три файла.

заголовок.h:

int SomeFunction();
inline int a = SomeFunction();

файл1.cpp:

#include "header.h"

int b = a + 5;

файл2.cpp

#include "header.h"

int c = a + 3;

Гарантированно ли, что a инициализируется перед b и c, что приводит к b == a + 5 и c == a + 3?

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

Я понимаю, что у меня нет никаких гарантий относительного порядка `b' и 'c', но это не проблема, поскольку они не зависят друг от друга.

«Гарантированно ли, что a инициализируется перед b и c, что приводит к b == 12 и c == 10?» Я не уверен, что понимаю вопрос. Разве это не было бы гарантировано, даже если бы a не было inline?

Nicol Bolas 24.12.2022 07:26
a имеет константную инициализацию, потому что 7 является константным выражением, поэтому порядок динамической инициализации в любом случае не имеет значения.
user17732522 24.12.2022 09:46

@NicolBolas, если a не является inline, то он может быть определен только ровно в одном из файлов file1.cpp и file2.cpp, он должен быть объявлен extern в другом. В каком бы файле он ни был объявлен extern, у меня явно нет гарантии порядка инициализации.

dgnuff 24.12.2022 09:50

@user17732522 user17732522 Спасибо за комментарий - я отредактировал, чтобы отразить это.

dgnuff 24.12.2022 09:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, это гарантировано.

https://en.cppreference.com/w/cpp/language/initialization#Dynamic_initialization

  1. Частично упорядоченная динамическая инициализация, которая применяется ко всем встроенным переменным, которые не являются явно или неявно созданными экземплярами специализации. Если частично упорядоченный V определен перед упорядоченным или частично упорядоченным W в каждой единице трансляции, инициализация V выполняется до инициализации W (или происходит раньше, если программа запускает поток).

  2. Упорядоченная динамическая инициализация, которая применяется ко всем другим нелокальным переменным: в пределах одной единицы трансляции инициализация этих переменных всегда выполняется в точном порядке, в котором их определения появляются в исходном коде. Инициализация статических переменных в разных единицах трансляции выполняется в неопределенной последовательности. Инициализация локальных переменных потока в разных единицах трансляции не упорядочена.

(жирный мой)

Другие вопросы по теме