Что не так с моей функцией макроса? - PullRequest
0 голосов
/ 28 июля 2011

Я определил многострочную макрофункцию, используя символ продолжения строки "\", как показано ниже:

#define SHOWMSG( msg ) \ 
{ \     
    std::ostringstream os; \     
    os << msg; \     
    throw CMyException( os.str(), __LINE__, __FILE__ ); \ 
}

Но он не смог пройти компиляцию.Кстати, я использую компилятор VS2008.Не могли бы вы сказать, что не так с моей вышеупомянутой функцией макроса?

Ответы [ 3 ]

6 голосов
/ 28 июля 2011

Обычный метод для макроса с несколькими операторами выглядит примерно так:

#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, чтобы соответствовать.

1 голос
/ 28 июля 2011

Обратная косая черта должна быть последним символом в строке для продолжения строки.

У некоторых ваших обратных косых черт есть пробелы после них.

0 голосов
/ 28 июля 2011

Нажмите Ctrl+Shift+8 в редакторе Visual Studio и увидите все пробелы, появляющиеся после завершающего \ - удалите их!

...