Это - единственная конструкция в C, который можно использовать для #define
составная операция, поместить точку с запятой после, и все еще использовать в if
оператор. Пример мог бы помочь:
#define FOO(x) foo(x); bar(x)
if (condition)
FOO(x);
else // syntax error here
...;
Даже фигурные скобки использования не помогает:
#define FOO(x) { foo(x); bar(x); }
Используя это в if
оператор потребовал бы, чтобы Вы опустили точку с запятой, которая парадоксальна:
if (condition)
FOO(x)
else
...
, Если Вы определяете НЕЧТО как это:
#define FOO(x) do { foo(x); bar(x); } while (0)
тогда следующее синтаксически корректно:
if (condition)
FOO(x);
else
....
Это - способ упростить проверку ошибок и избежать глубоко вложенного if's. Например:
do {
// do something
if (error) {
break;
}
// do something else
if (error) {
break;
}
// etc..
} while (0);
Это помогает группировке нескольких операторов в единственный, так, чтобы подобный функции макрос мог на самом деле использоваться в качестве функции. Предположим, что Вы имеете
#define FOO(n) foo(n);bar(n)
, и Вы делаете
void foobar(int n){
if (n)
FOO(n);
}
тогда, это расширяется до
void foobar(int n){
if (n)
foo(n);bar(n);
}
Уведомление, что второй вызов (панель (n)) не является частью если оператор больше.
Обертка оба в делают {}, в то время как (0), и можно также использовать макрос в если оператор.
В общем, do
/ while
хорошо для любого вида конструкции цикла, где нужно выполнить цикл [по крайней мере 115] однажды. Возможно эмулировать этот вид цикличного выполнения или через прямое while
или через даже for
цикл, но часто результат немного менее изящен. Я признаю, что определенные приложения этого шаблона довольно редки, но они действительно существуют. Тот, который приходит на ум, является основанным на меню консольным приложением:
do {
char c = read_input();
process_input(c);
} while (c != 'Q');