Задать вопрос
@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-полей для всего, кроме ресурсов.
  • Вопрос задан
  • 36 просмотров
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Академия Эдюсон
    Разработчик игр на Unreal Engine + ИИ
    9 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
opium
@opium
Просто люблю качественно работать
Похожий трюк масштабируется шире ресурсов: объявил static-поле в хедере без определения — если нужный .cpp не подключён к сборке, линковщик даст undefined reference. Так можно enforce'ить обязательную линковку конкретной единицы трансляции: регистрация плагина, feature-флаг, конфиг под сборку — забыл модуль, поймаешь на линковке, а не в рантайме.

Плюс: меняется только инициализатор — правишь .cpp, а не хедер, остальные TU не пересобираются каскадом. До C++17, пока не было инлайн-переменных, это вообще был единственный вариант.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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