Я думаю, что лучше бы это была функция:
bool fnAssert(bool cond, char * strCond, char *msg, char *file, int line)
{
if (!cond)
{
cerr << "@File: " << file << ":" << line << " " << strCond << " failed."
<< msg << endl;
}
return cond;
}
#define Assert(cond, a) fnAssert(cond, #cond, a, __FILE__, __LINE__)
Таким образом, он переносим на все компиляторы, будет показывать подсветку синтаксиса, а макрос позволяет автоматически вставлять имя файла и номер строки. Вы также сможете распечатать сбойное условие и установить точки останова при его отладке.
редактировать
Хотя это очень некрасиво, и я настоятельно советую вам не делать этого, вот способ автоматически вернуться к assert из кода (используя вышеупомянутые макросы):
#define ReturnOnAssert(cond, a, b) if (! Assert(cond,a) ) return b;
Теперь, когда вы пишете заявление:
ReturnOnAssert(isItBad, "Something bad happened", retVal);
или
DoWhatever(), ReturnOnAssert(isItBad, "Something bad happenedAgain", retVal);
Вы вернетесь из своей функции со значением retVal
, если isItBad
равно false.
НО - сокрытие return
в макросе - это большое НЕТ-НЕТ ИМХО. Не делай этого. Что вы пытаетесь сохранить, 2 строки кода на if
?