*** ВНИМАНИЕ: Блог переехал на другой адрес - demin.ws ***

вторник, 7 июля 2009 г.

Static assert

А какой у вас используется assert времени компиляции, если не использовать boost/static_assert.hpp?

У меня вот такой:
template <bool> struct STATIC_ASSERTION_FAILURE;
template <> struct STATIC_ASSERTION_FAILURE<true> {};
#define STATIC_CHECK(x) sizeof(STATIC_ASSERTION_FAILURE< (bool)(x) >)
Работает приемлемо сносно:
int main() {
STATIC_CHECK(sizeof(int) < sizeof(char));
return 0;
}

5 комментариев:

  1. #define COMPILE_TIME_ASSERT(x) \
    void __cta_proto__(int __cta_foo__[(x) ? 1 : -1])

    Может использоваться и на "plain C"

    ОтветитьУдалить
  2. Александреску? Это красиво...

    ОтветитьУдалить
  3. Какой именно от Александреску? темплетный или на C?

    ОтветитьУдалить
  4. Когда я писал комментарий я имел ввиду решение с шаблонами. Я посмотрел в книгу - там оба решения приводятся одно за других.

    В комментарии решения на С упоминается сторонняя публикация, кажется вот это http://ksvanhorn.com/Articles/ctassert.html . То, что есть в статье Александреску свёл к решению такому же, что и привёл Qehgt.

    Ну а решение с шаблонами от Александреску, конечно же :).

    ОтветитьУдалить
  5. #define CASSERT(COND) typedef char __AP_COMM_ASSERT[(COND) ? 1 : -1]

    ОтветитьУдалить