2015-02-26 2 views
2

http://erdani.com/index.php/books/modern-c-design/errata/ Page 25:Понимать во время компиляции Assertions

template<bool> struct CompileTimeChecker 
{ 
     CompileTimeChecker(...); 
}; 
template<> struct CompileTimeChecker<false> {}; 
#define STATIC_CHECK(expr, msg) \ 
    { \ 
     CompileTimeError<expr> \ 
     ERROR_##msg; \ 
     (void)ERROR_##msg; } 

template<class To, class From> 
To safe_reinterpret_cast(From from) 
{ 
     STATIC_CHECK(sizeof(From) <= sizeof(To), 
         Destination_Type_Too_Narrow); 
     return reinterpret_cast<To>(from); 
} 

int main(int argc, _TCHAR* argv[]) 
{ 
    //STATIC_CHECK(true, 
    //    Destination_Type_Too_Narrow); 

    double d = 1.0; 
    int* i = safe_reinterpret_cast<int*>(&d); 

    return 0; 
} 

Вопрос 1> Почему компилятор жалуется на использование Destination_Type_Too_Narrow?

Ошибка 4 Ошибка C2065: 'ERROR_Destination_Type_Too_Narrow': необъявленная идентификатор

Вопрос 2> Почему мы должны всегда использовать бросок (void) в макросе? Чтобы избежать предупреждения об неиспользованной переменной?

Вопрос 3> Почему STATIC_CHECK (false, XXX) вызовет ошибку компиляции?

Спасибо

+1

Надеюсь, вы знаете о ['static_assert'] (http://en.cppreference.com/w/cpp/keyword/static_assert)? – rubenvb

+1

VS2013 поддерживает ['static_assert'] (https://msdn.microsoft.com/en-us/library/vstudio/dd293588.aspx), есть ли причина, по которой вы ее не используете? 'static_assert (sizeof (To)> = sizeof (From)," Destination Type Too Narrow ");' –

+0

@RemyLebeau, нужно понимать концепцию и теорию – q0987

ответ

0

1: Вы не пытаетесь использовать шаблон функцию, поэтому компилятор не компилирует любого из реализации шаблона, поэтому утверждать не гаснет. В принципе, компилятор не испускает никакого кода для шаблонов, которые вы не используете (и эта функция используется во всех библиотеках шаблонов, таких как boost для разных целей).

2: Отливка до void является распространенным методом, позволяющим избежать предупреждения о неиспользуемых переменных. Если в вашем примере утверждение не сбой, тогда у вас будет неиспользованная переменная в вашем коде, и предупреждение о том, что вы можете избежать, считается плохим.