Для 1 его нельзя использовать следующим образом:
if (foo) MY_MACRO(bar);
else something_else();
Поскольку это будет расширено следующим образом:
if (foo) {
if (isTrue) {
do();
} else {
something_else();
}
}
else
(неожиданно) будетelse
для if
внутри макроса.
Плохая вещь в вашем текущем подходе заключается в том, что его нельзя использовать там, где требуется оператор (например, f((MY_MACRO(a), b), c)
в выражении запятой не будетработать), но поскольку вы используете его для побочных эффектов do()
, он не будет использоваться там, где требуется утверждение.
Поскольку оно кажется довольно коротким, вы можете заставить его действовать как утверждение,просто добавьте еще пару скобок, чтобы решить вашу проблему с помощью 2:
#define MY_MACRO(isTrue) ((isTrue) ? do() : (void)0)
Вы также должны рассмотреть static conditional_do(bool isTrue) { if (isTrue) { do(); } }
вместо макроса.