перенос в do-while-0 против переноса в тернарный оператор с (void) 0 - PullRequest
0 голосов
/ 10 апреля 2019

Я смотрю на этот макрос в 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 ++.

1 Ответ

0 голосов
/ 10 апреля 2019

Итак, мой skillz говорит мне, что CHECK_1 и CHECK_2 должны быть полностью эквивалентны и иметь дело только со стилем. Я не могу понять, почему это не так. @NathanOliver, похоже, согласен.

...