Во время просмотра источников драйвера LinCAN я обнаружил некоторые макросы, которые сбивали меня с толку.
#else /*CONFIG_PREEMPT*/
#define can_preempt_disable() do { } while (0)
#define can_preempt_enable() do { } while (0)
#endif /*CONFIG_PREEMPT*/
Я понимаю полезность
do {
...;
if(condition) break;
...
} while (0);
используя break
как вид throw
. Я полупонимаю обертывание последовательности функций, таких как
#define FOO() do { foo(); bar(); } while (0)
чтобы избежать оговорок с бесцельной if
. Я понимаю, что иногда для #define требуются "операторы no-op". Но почему именно этот вид? в частности, пустые фигурные скобки, ложное состояние, делать... пока? Некоторые синтаксические оговорки, которые я не могу понять?