Какая польза от do while (0), когда мы определяем макрос?

Он позволяет группировать lisp-macros несколько операторов в один c макрос.

Предположим, вы сделали macro что-то вроде:

if (foo) 
    INIT_LIST_HEAD(bar);

Если макрос macro был определен без инкапсулирующего custom-macros do {...} while (0);, приведенный lisp-macros выше код расширился бы до

if (foo)
    (bar)->next = (bar);
    (bar)->prev = (bar);

Это scala-macros явно не то, что было задумано, так custom-macros как только первая инструкция custom-macros будет выполнена, если foo lisp-macros удерживается. Второй оператор lisp-macros будет выполняться независимо macro от того, удерживается ли custom-macros foo.

Изменить: дополнительные linux-kernel пояснения на страницах http://c-faq.com/cpp/multistmt.html и scala-macros http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/cpp/Swallowing-the-Semicolon.html#Swallowing-the-Semicolon

c

macros

linux-kernel

2022-09-15T18:15:00+00:00