В чем причина этого неоперируемого цикла while, используемого для макроса assert? - PullRequest
2 голосов
/ 01 ноября 2011

Я рассматриваю кодовую базу, где макрос assert раскрывается следующим образом в не отладочных конфигурациях:

#define assert( what ) while( 0 )( ( void )1 )

, которые я не совсем понимаю.Очевидно, цель состоит в том, чтобы иметь неоперативный.Тогда почему бы не развернуть пустую строку?

#define assert( what )

В чем причина этого цикла без операции?

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Скорее всего, чтобы избежать предупреждений компилятора. Проверьте, не вызывает ли этот код предупреждение о пустом операторе:

if (foo);

Если это так, то хотите ли вы такое же предупреждение в режиме выпуска для следующего кода?

if (foo) assert(what);

C99 (что относится к C ++ 11) также говорит, что assert расширяется до «пустого выражения». IIRC, один пробел не является выражением , хотя пробел, за которым следует точка с запятой, является выражением-выражением . Старая добрая грамматика БНФ.

Кстати, это определение assert не соответствует стандартам. C89 и C99 оба говорят, что когда определено NDEBUG, тогда assert определяется как:

#define assert(ignore) ((void)0)

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

2 голосов
/ 01 ноября 2011

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

...