在浏览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
引起的警告。我理解有时需要使用“无操作语句”来定义#。但是为什么要用这种特定的语法?具体来说,空大括号、false条件、do...while循环?有些语法细节我不太明白?
(void)0
可以达到防止表达式的值被使用的目标。 - M.M