Я смотрю на этот макрос в GSL Microsoft:
#define GSL_CONTRACT_CHECK(type, cond) \
(GSL_LIKELY(cond) ? static_cast<void>(0) \
: gsl::details::throw_exception(gsl::fail_fast( \
"GSL: " type " failure at " __FILE__ ": " GSL_STRINGIFY(__LINE__))))
Давайте упростим его, чтобы игнорировать то, что мне безразлично:
#define CHECK_1(cond) \
(cond ? static_cast<void>(0) : do_something() )
Теперь я бы интуитивно написал что-то вроде:
#define CHECK_2(cond) \
do { \
if (not (cond)) {do_something();} \
} while(0)
Мой вопрос: есть ли разница между этими механизмами упаковки?Может быть, есть какой-то случай, когда один вызывает непреднамеренную ошибку компиляции, но не другой?
Примечание:
- Это может быть замаскированный вопрос C, яне уверен, что здесь есть какие-либо проблемы с C ++.