#c #компиляция #отладка
В некоторых ситуациях для облегчения обнаружения и исправления ошибок в программе может потребоваться сделать несколько утверждений об истинности/ложности какого-то выражения, не только во время выполнения, но и во время компиляции. В С++ для этого применяется static_assert. Примеры: Утверждение о версии подключенной библиотеки: #include "SomeLibrary.h" static_assert(SomeLibrary::Version > 2, "Старые версии SomeLibrary не поддерживаются, используйте новые."); Утверждение о количестве бит в unsigned int: static_assert(sizeof(unsigned int) * CHAR_BIT == 32, "Компиляция на неподдерживаемой платформе"); Как создавать подобные утверждения в обычном C, где есть только ассерты времени выполнения в виде макроса из assert.h?
Ответы
Ответ 1
Для этого можно использовать любую ошибку компиляции, например структуры с битовыми полями отрицательного размера: #define CT_ASSERT_NULL(x) ((void *)sizeof(struct { int:-!!(x); })) #define CT_ASSERT_ZERO(x) sizeof(struct { int: -!!(x); })) #define CT_ERROR sizeof(struct { int: -1;}); Кроме того такая функция добавлена, начиная со стандарта C11 и в gcc-4.6 теперь можно делать так: _Static_assert( sizeof(int) == sizeof(long int), "Error!");
Комментариев нет:
Отправить комментарий