Я читаю утверждение времени компиляции, после поиска в Интернете я получил код, который я не понял.
template <bool> struct CompileAssert {};
#define COMPILE_ASSERT(expr, msg) \
typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]
Использовал этот COMPILE_ASSERT, как показано ниже.
COMPILE_ASSERT(!sizeof(T*), PassRefPtr_should_never_be_assigned_to)
Но я не получил идею. Может ли кто-нибудь помочь мне в понимании вышеупомянутой части кода.
Второй запутался в этом куске кода
typedef CompileAssert<(bool(expr))> msg[bool(expr) ? 1 : -1]
#Define заменит COMPILE_ASSERT (expr, msg) с вышеупомянутым expession.но как msg [bool (expr)? 1: -1] альтернативный тип для CompileAssert<(BOOL (выражение))>.
Пожалуйста, кто-нибудь объяснит подробно и просто. У меня много много много вопросов.
Например, почему сообщение (PassRefPtr_should_never_be_assigned_to) работает без использования «» для символа *
Если вы передадите выражение макросу, который оценивается как false, макрос даст typedef, как показано ниже:
typedef CompileAssert<false> PassRefPtr_should_never_be_assigned_to[false ? 1 : -1];
который
typedef CompileAssert<false> PassRefPtr_should_never_be_assigned_to[-1];
Таким образом, поскольку отрицательные длины массива недопустимы, компилятор выдаст ошибку для typedef, содержащую «msg» в качестве имени массива.
typedef
назовет законный или недопустимый фрагмент кода, в зависимости от значения expr
,
Скажем bool(expr)
является true
, В этом случае typedef эквивалентен
typedef CompileAssert<true> msg[1];
Это массив из 1 элемента CompileAssert<true>
структуры, названные msg
, поскольку CompileAssert<bool>
это определенная структура, все хорошо.
Однако если bool(expr)
является false
typedef будет эквивалентен следующему:
typedef CompileAssert<false> msg[-1];
Это, конечно, незаконно (вы не можете создать массив размером -1), поэтому компилятор сообщит об ошибке, которая msg
плохо сформирован. И потому что msg
параметр макроса, фактически это будет текст, представленный в COMPILE_ASSERT
поэтому сообщение об ошибке для вашего примера может выглядеть примерно так:
Cannot create array PassRefPtr_should_never_be_assigned_to of size -1.
Также обратите внимание, что C ++ 11 имеет встроенный static_assert
,