Обычный метод для макроса с несколькими операторами выглядит примерно так:
#define SHOWMSG(msg) \
do { \
std::ostringstream os; \
os << msg; \
throw CMyException(os.str(), __LINE__, __FILE__); \
} while (0)
Без этого точка с запятой после закрывающей скобки может вызвать синтаксические проблемы, такие как:
if (x)
SHOWMSG("This is a message");
else
// whatever
При вашем исходном коде это расширилось бы до:
if (x) {
std::ostringstream os;
os << "This is a message";
throw CMyException(os.str(), __LINE__, __FILE__);
}
; // on separate line to emphasize that this is separate statement following
// the block for the if statement.
else
// whatever
В этом случае точка с запятой будет образовывать нулевой оператор после блока в операторе if
, а else
не будету него есть if
, чтобы соответствовать.