Ну ... Так как вам действительно удалось запутаться в своем вопросе, я подумал, что займусь этим подробнее.Во-первых, мы должны классифицировать соответствующие свойства переменной: время жизни, видимость, связь. На них влияют ключевые слова: static
, inline
, constexpr
, const
, extern
, которые вы используете в своем вопросе..
В области имен в определении переменной:
- static
: указывает внутреннюю связь
- inline
: допускает несколько идентичных определений одной и той же переменной в разных единицах перевода и гарантирует, что они будутссылаются на один и тот же объект (например, имеют одинаковые адреса)
- constexpr
: подразумевает const
- const
: по умолчанию используется внешняя связь
- extern
: указывает внешнюю связь
Таким образом,
- global_non_expl_inline
: по умолчанию используется внешняя связь.Нет проблем, если только другой модуль перевода не определит другую такую переменную с внешней связью.
- global_non_expl_inline_static
: внутренняя связь.Хорошо, если вы нигде не определяете другие такие переменные.
- global_expl_inline
: Внешняя связь и inline
.Нет проблем, если только другой модуль перевода не объявит другую такую переменную без inline
.
- global_expl_inline_explicit_static
: Хорошо, переменная static inline
имеет смысл, если вы не хотите, чтобы она была доступна во время ссылки, но хотитеодна и та же переменная во всех ваших единицах перевода - например, полезна для всех видов констант.
- global_expl_inline_explicit_extern
: внешняя связь и inline
.Нет проблем, если только другой модуль перевода не объявит другую такую переменную без inline
.
- global_expl_inline_explicit_extern_but_unnamed_ns
: внутренняя связь в соответствии с cppreference .
На уровне класса:
- in_class_static
: внешняя связь.Хорошо, согласно cppreference , но требует объявления в области имен пространства, если оно используется odr.
- in_class_but_out_of_source_def
: внешняя связь.Также хорошо.Это на самом деле стандартный способ.
В заключение, есть (гораздо) менее неопределенное поведение, чем вы думаете - и это хорошо.Однако есть несколько вещей, которые являются действительными, но на самом деле не имеют смысла, например extern
в безымянных пространствах имен.
Что касается вашего комментария по этому вопросу: я не могу воспроизвести проблему, а и другие люди тоже не могутв разделе комментариев этого вопроса .Есть также другие проблемы правдоподобия с вопросом, который вы можете найти в разделе комментариев.Имейте в виду, что некоторые вопросы о стековом потоке задают люди, которые точно не знают, какие шаги они предпринимают при возникновении проблем .Я бы не стал слишком беспокоиться об этом конкретном вопросе;)