От:
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
Здравствуйте, cppnick, Вы писали:
C>Хочу сабж.
Бери C++0x, там есть нормальный static_assert
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
От:
jazzer
Skype: enerjazzer
Дата: 09.12.11 02:20
Оценка:
Здравствуйте, cppnick, Вы писали:
C>Хочу сабж.
BOOST_MPL_ASSERT_RELATION( sizeof (uint32_t), ==, 4 );
От:
cppnick
Дата: 10.12.11 00:23
Оценка:
Здравствуйте, Banned by IT, Вы писали:
BBI>Здравствуйте, cppnick, Вы писали:
C>>Хочу сабж.
BBI>Бери C++0x, там есть нормальный static_assert
Дык есть он (в ICC, к примеру), но хочу sizeof_assert тоже, см. требования.
От:
cppnick
Дата: 10.12.11 00:23
Оценка:
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, cppnick, Вы писали:
C>>Хочу сабж.
J>J>BOOST_MPL_ASSERT_RELATION( sizeof (uint32_t), ==, 4 );
J>
Нуу, за наводку спасибо, но буст ради одной строчки в утилиту размером до 4кб..
Здравствуйте, 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, значит пора закрыть эту страницу.
Всем пока
От:
jazzer
Skype: enerjazzer
Дата: 10.12.11 04:30
Оценка:
Здравствуйте, cppnick, Вы писали:
J>>J>>BOOST_MPL_ASSERT_RELATION( sizeof (uint32_t), ==, 4 );
J>>
C>Нуу, за наводку спасибо, но буст ради одной строчки в утилиту размером до 4кб..
ну скопируй оттуда только ассерты, это копейки.
А вообще, первая доза бесплатно
От:
cppnick
Дата: 10.12.11 08:36
Оценка:
Здравствуйте, Banned by IT, Вы писали:
BBI>Дык всё в руках твоих:
sizeof(T) не печатается.
От:
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" );
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить