Задать вопрос
@ImagineTables

Используете ли вы static не inline, и для чего?

С тех пор, как static-поля стало можно делать инлайновыми, пользуетесь ли вы для чего-то не инлайновыми static-полями?

Я нашёл один полезный кейс — ресурсы. Объявляю в хедере Resource.h дерево структур, типа:

struct Resources
{
    struct Type1
    {
        static Text Resource1; // Text это тип, могут быть другие типы
    }
};


А инициализацию:

Resources::Type1::Resource1 = ...;

делаю в каждой из локализаций: Resource.en.cpp, Resource.ru.cpp и т.д. Локализации переключаются макросами. Забыл локализовать используемый ресурс или неправильно подключил локализацию — лови ошибку линкера (в этом смысл). Удобно ли ресурсы хранить в формате C++, это отдельный вопрос.

Есть ли другие сценарии? Просто думаю, насколько оправдано в гайдлайн включить пункт о неиспользовании неинлайновых static-полей для всего, кроме ресурсов.
  • Вопрос задан
  • 242 просмотра
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Академия Эдюсон
    Разработчик игр на Unreal Engine + ИИ
    9 месяцев
    Далее
  • Бруноям
    Разработчик на C++
    5 месяцев
    Далее
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
Похожий трюк масштабируется шире ресурсов: объявил static-поле в хедере без определения — если нужный .cpp не подключён к сборке, линковщик даст undefined reference. Так можно enforce'ить обязательную линковку конкретной единицы трансляции: регистрация плагина, feature-флаг, конфиг под сборку — забыл модуль, поймаешь на линковке, а не в рантайме.

Плюс: меняется только инициализатор — правишь .cpp, а не хедер, остальные TU не пересобираются каскадом. До C++17, пока не было инлайн-переменных, это вообще был единственный вариант.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@ReggieMan
А чем inline переменные в хедере с C++17 хуже? Я просто пишу static int x = 5; прямо в классе, и все работает без отдельных cpp-файлов. Зачем усложнять
Ответ написан
Комментировать
@ImagineTables Автор вопроса
Ещё кейс вспомнил: можно менять порядок инициализации (если, например, одни значения зависят от других). На практике это, опять же, удобно для описания ресурсов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы