#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!");
Комментариев нет:
Отправить комментарий