nyaload

Журнал Пушыстого

Журнал Пушыстого

совмещаем assert и static_assert
nyaload
_winnie
В документе о стандарте программирования софта для марсохода Curiosity наткнулся на один любопытный трюк, который проверяет условия assert в compile-time, если это возможно. Например, assert((BIT_MASK & (BIT_MASK + 1)) == 0)
Типично assert в debug-режиме записывается как-то так:

#define assert(x) ((void)( (x) ? 0 : report_fail() ))

Ещё в report_fail() обычно передают __LINE__, __FILE__ и #x, но речь не об этом.
Добавим в это выражение деление на условие ассерта:

#define assert(x) ((void)( (x) ? (0?(1 / ((x)?1:0)):0) : ( report_fail( )) ))

Теперь если x является константным выражением вычислимым в compile-time, вменяемый компилятор предупредит о попытке деления на ноль.

Microsoft Visual C++:
error C2124: divide or mod by zero
g++:
x.cpp:11: warning: division by zero


static_assert со счетов сбрасывать не стоит, так как он явно просит проверить в compile_time, а assert легко случайно обмануть и незаметно сделать compile-time проверку в runtime. Например int f() { return sizeof(int); } ... { assert(f() == 25); }
Tags:

You are viewing _winnie