Похоже, вы пытаетесь превзойти предполагаемые плохие сообщения вашей IDE, цитируя их полностью вне контекста и только частично.Позвольте мне разобрать его:
TryCatch
Макрос определен как
TryCatch(condition, cleanup, message)
Когда условие оценивается как ложное, оно переходит в CATCH.Вы можете думать о макросе так:
if (!condition)
{
goto CATCH;
}
Например, вы можете использовать его так:
void TryCatchDemo::UseTryCatch(void)
{
TryCatch(1==2, , "1 is NOT 2");
AppLog("This should not appear");
CATCH:
AppLog("Catch block");
}
Теперь ваш второй параметр - строковый литерал, "Failed to get canvas: %S"
что неудивительно, но при использовании в качестве оператора ничего не дает:
"does nothing";
123; // just like this
Так что компилятору приятно предупредить вас о том, что вы, вероятно, имели в виду что-то еще.Также обратите внимание, что statement has no effect
является , а не синтаксической ошибкой.
"при инициализации здесь"
Знайте свой язык!Код, приведенный выше, не является допустимым для C ++:
SearchForm::SearchForm(void) :
В лучшем случае это начало определения конструктора с отсутствующим списком инициализатора и телом.В спецификации языка C ++ члены класса инициализируются в том порядке, в котором они были объявлены , а не в том порядке, в котором они появляются в списке инициализаторов.Минимальный пример:
struct X
{
int a, b;
X() : b(), a() {}
};
Это приводит к предупреждению компилятора:
/tmp/test.cpp|3 col 13| warning: ‘X::b’ will be initialized after [-Wreorder]
/tmp/test.cpp|3 col 10| warning: ‘int X::a’ [-Wreorder]
/tmp/test.cpp|4 col 6| warning: when initialized here [-Wreorder]
Как видите, вы вырезали не только код, но и предупреждения!Если вы прочитаете все сообщение и весь код, исправление будет довольно очевидным:
struct X
{
int a, b;
X() : a(), b() {}
};
Бонус : Если вам интересно, почему порядок имеет значение, подумайте, что происходит, когдавы делаете:
struct X
{
int a, b;
X() : b(), a(b) {} // OOPS!
};
Надеюсь, это поможет
Использование строки форматирования с макросами
Редактировать Я только что заметил: это, вероятно, нетподдерживается использование строк формата внутри макросов Try / Catch:
Каждый из макросов, поддерживающих параметры сообщения, фактически поддерживает строки формата.Строка формата аналогична строке формата printf в системах, которые ее поддерживают (bada НЕ поддерживает ее)