Страницы

Поиск по вопросам

среда, 5 июня 2019 г.

Как создать ассерт времени компиляции(аналог static_assert) в 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?


Ответ

Для этого можно использовать любую ошибку компиляции, например структуры с битовыми полями отрицательного размера:
#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!");

Комментариев нет:

Отправить комментарий