В документе о стандарте программирования софта для марсохода 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); }