【发布时间】:2021-07-20 07:20:07
【问题描述】:
我想我会很聪明,并围绕禁用/启用中断编写一个小的预处理器包装器,如下所示:
#define WITH_INTERRUPTS_DISABLED(_body) \
do { \
uint32_t primask = DisableGlobalIRQ(); \
do { \
_body \
} while (0); \
EnableGlobalIRQ(primask); \
} while (0)
GCC 预处理器,当出现此源时:
WITH_INTERRUPTS_DISABLED(
i += 2;
quux();
);
... 生成此输出(重新格式化以提高可读性):
do {
uint32_t primask = DisableGlobalIRQ();
do {
i += 2;
quux();
} while (0);
EnableGlobalIRQ(primask);
} while (0)
根据Mr. Godbolt,所有 GCC 变体的行为都与上述相同,省略了结束分号。同时,所有clang 变体的输出都包含分号。
有没有办法说服 GCC 包含分号?
【问题讨论】:
-
你的godbolt链接不包含代码;你需要使用分享按钮来获得一个永久链接。
-
实际神螺栓链接:godbolt.org/z/94e4q3ehK
-
Here's 一个关于支持 -E 输出的开放问题。
标签: c gcc clang preprocessor