Какая польза от while (0), когда мы определяем макрос?
Возможный дубликат:
Операторы Do-While и if-else в макросах C / C ++
Я читаю kernel linux, и я нашел много таких макросов:
#define INIT_LIST_HEAD(ptr) do { \ (ptr)->next = (ptr); (ptr)->prev = (ptr); \ } while (0)
Почему они используют это, а не определяют его просто в {}?
- Как выбрать переключатели по значению ячейки в Excel?
- Какой самый простой способ использовать reify (получить AST) выражение в Scala?
- Найти и заменить несколько значений в выбранных ячейках
- В чем разница между макросом и константой в C ++?
- iOS Как обнаружить iPhone X, iPhone 6 плюс, iPhone 6, iPhone 5, iPhone 4 от макроса?
- Восстановите защиту листа при сохранении и закрытии
- Определения макросов C # в препроцессоре
- VBA Macro для сортировки и применения условного форматирования к диапазону ячеек с динамическим числом строк
- Зачем нужен двойной слой косвенности для макросов?
- Могу ли я искать и заменять макрос Notepad ++?
- В Excel я вставил кучу URL-адресов, но они не являются живыми ссылками - как я могу преобразовать их в живые ссылки?
- Что делает макрос Q_OBJECT? Почему все объекты Qt нуждаются в этом макросе?
- Как найти переменные документа в MS Word без использования макроса
Вы можете следовать за ним точкой с запятой и заставлять ее выглядеть и действовать как функция. Он также работает с правилом if / else.
Без времени (0) ваш код выше не будет работать с
if (doit) INIT_LIST_HEAD(x); else displayError(x);
так как точка с запятой после макроса будет «есть» предложение else, и выше не будет даже компилироваться.
Он позволяет группировать несколько операторов в один макрос.
Предположим, вы сделали что-то вроде:
if (foo) INIT_LIST_HEAD(bar);
Если макрос был определен без инкапсуляции do {…} while (0);, приведенный выше код будет расширяться до
if (foo) (bar)->next = (bar); (bar)->prev = (bar);
Это явно не то, что было предназначено, так как только первый оператор будет выполнен, если foo имеет место. Второй оператор будет выполнен независимо от того, выполняется ли foo.
Изменить: дальнейшее объяснение на http://c-faq.com/cpp/multistmt.html и http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/Swallowing-the-Semicolon.html # глотание-The-Запятая