C не поддерживает ничего эквивалентного. Если у вас есть цепочка инструментов, которая поддерживает пользовательские события сборки, вы можете ввести шаг предварительной сборки, вызывающий e. г. скрипт Python (или любой другой язык, который вы предпочитаете). Этот скрипт тогда будет:
- загрузить заголовочный файл
- итерация по всем строкам, пока не будет найдена рассматриваемая структура
- проверка всех известных членов в желаемом порядке (т. Е. Ни один член не заменен)
- наконец, проверьте, достигнут ли конец структуры (т. Е. Новые члены не добавлены)
Если цепочка инструментов останавливается, если задача перед сборкой завершается неудачно, вы уже ушли (просто верните 0 в случае успеха и все остальное в случае неудачи), в противном случае вы могли бы создать простой C-файл, пустой при успехе и содержащий #error
директива о сбое.
В вашем C-коде вы можете дополнительно убедиться, что размер вашей структуры соответствует:
#define CONCATENATE(X, Y) CONCATENATE_(X, Y)
#define CONCATENATE_(X, Y) X##Y
#define STATIC_ASSERT(CONDITION) \
typedef int(CONCATENATE(_static_assert_, __LINE__))[(CONDITION)? 1 : -1]
STATIC_ASSERT(sizeof(struct errors) == sizeof(unsigned char));
Макрос определен для повторного использования, так как, однако, может выдавать дополнительные предупреждения, если используется в теле функции (из-за неиспользуемого локального типа).