Что означает этот макрос rsAssert? - PullRequest
2 голосов
/ 20 февраля 2012

я нашел этот код отсюда

#if 1
#define rsAssert(v) do {if(!(v)) LOGE("rsAssert failed: %s, in %s at %i", #v, __FILE__, __LINE__);} while(0)
#else
#define rsAssert(v) while(0)
#endif

Вопрос 1:

Здесь я не понимаю, почему используется do and whileВот?Есть ли особая причина для использования этого?

Вопрос 2:

Какова цель сделать все это в макросе.Почему только один не использует assert()?

Я думаю, возможно, есть веская причина для этого ..

Ответы [ 3 ]

3 голосов
/ 20 февраля 2012

Ваш первый вопрос о том, почему существует «цикл» do / while, описан здесь: Какая польза от do while (0), когда мы определяем макрос?

Ответ наНа второй вопрос лучше ответить автор кода, но я думаю, что они хотели бы использовать свою собственную систему ведения журнала, когда утверждение не удалось, а не по умолчанию.

2 голосов
/ 20 февраля 2012

do / while - это хорошо известная уловка для превращения блока утверждений в нечто, что синтаксически действует как отдельный оператор. Это позволяет использовать в таких местах, как:

if (whatever)
    rsAssert(whatever);
else
    // ...

, тогда как в большинстве случаев в этом случае возникает синтаксическая ошибка.

Что касается того, зачем вообще его использовать: потому что он записывает вывод с LOGE вместо печати в stderr, и (если LOGE не делает этого), кажется, что это не прерывает программу, как assert. 1009 *

0 голосов
/ 20 февраля 2012

Как много раз спрашивалось ранее, причиной использования цикла do-while является синтаксический сахар:

// this line would be valid if a simple if was used:
rsAssert(myAssert)

// with a do-while, however, this is now invalid:
rsAssert(myAssert)

// so, that means you have to add the ';' to make it look like a function call:
rsAssert(myAssert);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...