Цитата(ViKo @ Sep 28 2013, 11:58)

Точка с запятой стоит намеренно. Но я, хоть убей не понимаю поведения codepad! Подставляю ту же строку из макро - и не печатает! (первый пример)
Такой результат получится с любым исправным компилятором. Если есть под рукой GCC - посмотрите результат препроцессора. У меня под рукой нет. Поэтому сделаем препроцессинг вручную.
Код
if (0)
if (1)
aaa();
превращается в
Код
if (0)
if (1)
; { printf("Good style saves you\n"); };
Или, после причесывания
Код
if (0)
if (1)
;
{
printf("Good style saves you\n");
};
А вывод один - обрамляйте любую макрофункцию, состоящую более чем из вызова одной функции, do {} while(0), и будет вам счастье.
Цитата(Ruslan1 @ Sep 28 2013, 12:03)

я совершенно не представляю ситуацию когда не будет работать конструкция
Код
#define MacroName(параметры_если_есть) \
{ /*комментарий0 если нужен */ \
оператор1; /*комментарий1 если нужен */ \
оператор2; /*комментарий2 если нужен */ \
}
Будьте добры, приведите мне любой пример кода, где определенный так макрос будет работать некорректно.
Ruslan1, выше был пример. Но я повторю его, так как выше смешал два случая:
Код
#define aaa() { printf("XXX\n"); }
if (1)
aaa();
else
printf("Yo are so wrong\n");
просто не скомпилируется.