Страницы

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

воскресенье, 15 марта 2020 г.

Как создать ассерт времени компиляции(аналог static_assert) в C?

#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!");

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

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