Утвердите sizeof (obj) во время компиляции и выведите фактический размер, если он не соответствует (c ++ 98) - PullRequest
1 голос
/ 11 мая 2019

У меня есть структура obj и функция (в отдельном файле), которая заполняет эту структуру некоторыми значениями.Из-за системного дизайна эта функция не могла быть частью структуры (которая генерируется скриптом).Со временем структура может измениться, поэтому функцию следует соответствующим образом обновить.Проблема в том, что разработчик, который изменяет структуру, может забыть обновить соответствующую функцию, и компилятор не будет напоминать об этом (если будут добавлены некоторые параметры, а существующие параметры останутся прежними). ​​

Лучшая идея, которую я имею в виду, это проверить sizeof(obj) во время компиляции и сравнить его с предыдущим известным размером.Когда структура изменится в размере, компилятор выдаст ошибку, поэтому разработчик рассмотрит эту функцию поближе и обновит ее.

Этот вопрос имеет решение для STATIC_ASSERT,Проблема в том, что компилятор не печатает текущий размер структуры.Поэтому разработчик не будет знать, что задать в качестве нового ожидаемого размера структуры.

Я хочу что-то вроде этого:

STATIC_ASSERT(sizeof(obj) == 1234)

И компилятор должен вывести что-то вроде:

error: ... sizeof(obj) is 5678 ...

Если sizeof (obj) соответствует ожидаемому, компилятор не должен ничего печатать.

Это решение выводит предупреждение со значением sizeof(), но в моей среде сборки предупреждения обрабатываются как ошибки, поэтому я не смог применить это решение: моя сборка завершится с ошибкой всевремя из-за этого предупреждения.

Так как я могу заставить компилятор выдавать ошибку или предупреждение , только если sizeof не так, как ожидалось?

1 Ответ

2 голосов
/ 11 мая 2019

Один из способов «отобразить» значение во время компиляции - ошибка:

template <std::size_t N> struct Debug; // No definition

template <> struct Debug<1234> {}; // Definition for "old" sizeof;

template struct Debug<sizeof(obj)>; // Issue error if definition is missing

Демонстрация без ошибок
Демонстрация с ошибкой

Сообщение об ошибке похоже на:

ошибка: явное создание экземпляра 'struct Debug<5678ul>' перед определением шаблона

...