sizeof_assert
От: cppnick  
Дата: 08.12.11 17:19
Оценка:
Хочу сабж.

Гугл показал такой код, но я хочу в compile time.

Итак, требования:
1) ассерт времени компиляции (static_assert)
2) диагностическое сообщение в вывод компилятора с распечаткой информации
3) возможность использования в любом месте кода (области видимости — в хидере, внутри класса, внутри функции и т.д.)

Пока что родился такой вот уродец:

template<typename T, size_t sizeofT, size_t expected>
struct __sizeof_assert
{
  char _[sizeofT == expected];
};

#define sizeof_assert(T, expected_size) static const __sizeof_assert<T, sizeof(T), expected_size> __SIZEOF_ASSERT_ ## __LINE__; static_assert(sizeof(T) == expected_size, "wrong type size")

// использование
sizeof_assert(uint32_t, 4);


вывод (VC9, static_assert тоже самодельный, ессно):

1>hxx(1) : warning C4200: nonstandard extension used : zero-sized array in struct/union
1> Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array
1> cpp(4) : see reference to class template instantiation '__sizeof_assert<T,sizeofT,expected>' being compiled
1> with
1> [
1> T=std::uint32_t,
1> sizeofT=4,
1> expected=3
1> ]
1>cpp(4) : error C2118: negative subscript


вывод (gcc):

t.cpp: In instantiation of '__sizeof_assert<int, 4u, 1u>':
t.cpp:10: instantiated from here
Line 4: error: ISO C++ forbids zero-size array

Re: sizeof_assert
От: Banned by IT  
Дата: 08.12.11 20:06
Оценка: +1
Здравствуйте, cppnick, Вы писали:

C>Хочу сабж.

Бери C++0x, там есть нормальный static_assert
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re: sizeof_assert
От: jazzer Россия Skype: enerjazzer
Дата: 09.12.11 02:20
Оценка:
Здравствуйте, cppnick, Вы писали:

C>Хочу сабж.


BOOST_MPL_ASSERT_RELATION( sizeof(uint32_t), ==, 4 );
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: sizeof_assert
От: cppnick  
Дата: 10.12.11 00:23
Оценка:
Здравствуйте, Banned by IT, Вы писали:

BBI>Здравствуйте, cppnick, Вы писали:


C>>Хочу сабж.

BBI>Бери C++0x, там есть нормальный static_assert
Дык есть он (в ICC, к примеру), но хочу sizeof_assert тоже, см. требования.
Re[2]: sizeof_assert
От: cppnick  
Дата: 10.12.11 00:23
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, cppnick, Вы писали:


C>>Хочу сабж.


J>
J>BOOST_MPL_ASSERT_RELATION( sizeof(uint32_t), ==, 4 );
J>

Нуу, за наводку спасибо, но буст ради одной строчки в утилиту размером до 4кб..
Re[3]: sizeof_assert
От: Banned by IT  
Дата: 10.12.11 03:09
Оценка:
Здравствуйте, cppnick, Вы писали:

C>>>Хочу сабж.

BBI>>Бери C++0x, там есть нормальный static_assert
C>Дык есть он (в ICC, к примеру), но хочу sizeof_assert тоже, см. требования.

Дык всё в руках твоих:

#define sizeof_assert(T, expected_size)    static_assert (sizeof(T) == expected_size, "sizeof (" #T ") != " #expected_size);

.\test.cpp(3): error: static assertion failed with "sizeof (int) != 3"
      sizeof_assert(int, 3)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[3]: sizeof_assert
От: jazzer Россия Skype: enerjazzer
Дата: 10.12.11 04:30
Оценка: :)
Здравствуйте, cppnick, Вы писали:

J>>
J>>BOOST_MPL_ASSERT_RELATION( sizeof(uint32_t), ==, 4 );
J>>

C>Нуу, за наводку спасибо, но буст ради одной строчки в утилиту размером до 4кб..

ну скопируй оттуда только ассерты, это копейки.
А вообще, первая доза бесплатно
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: sizeof_assert
От: cppnick  
Дата: 10.12.11 08:36
Оценка:
Здравствуйте, Banned by IT, Вы писали:

BBI>Дык всё в руках твоих:

sizeof(T) не печатается.
Re: sizeof_assert
От: Myrgy Беларусь  
Дата: 14.12.11 07:28
Оценка:
Здравствуйте, могу предложить такой вариант

namespace _test
{
    template<bool> struct CompileTimeCheker{};

    template<> struct CompileTimeCheker<true>
    {
        CompileTimeCheker(...);
    };

    template<> struct CompileTimeCheker<false>{};
}

#define STATIC_CHECK(expr, msg)\
{\
    class ERROR_##msg{};\
    (void)sizeof(_test::CompileTimeCheker<(expr) != 0>::CompileTimeCheker(ERROR_##msg()));\
}

STATIC_CHECK(sizeof(int) == 4, "wrong size");
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.