gpt4 book ai didi

c - 我的分号怎么了? (gcc 预处理器)

转载 作者:行者123 更新时间:2023-12-04 00:50:14 26 4
gpt4 key购买 nike

我想我会很聪明,围绕禁用/启用中断编写一个小的预处理器包装器,如下所示:

#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 包含分号?

最佳答案

分号没有发生任何变化,GCC 生成的很好。如果 GCC 和 clang 在这种基本的东西上有所不同,那将是非常令人吃惊的,这肯定是由 C 标准明确定义的,并且在实际代码中广泛使用。

然而 Godbolt Compiler Explorer 的默认设置会将其过滤掉,可能是因为它看起来像汇编语言中的注释。来自 interjay 的示例:https://godbolt.org/z/94e4q3ehK

如果关闭“Filter:Comments”,您会看到分号在那里,前面有几个空行:https://godbolt.org/z/7n896or8Y

  do { uint32_t primask = DisableGlobalIRQ(); do { i += 2; quux(); } while (0); EnableGlobalIRQ(primask); } while (0)


;

正如 interjay 指出的那样,Explorer 旨在显示汇编输出,而不是预处理的 C,因此 -Enot supported very well 也就不足为奇了。 .

似乎 clang 省略了空行,我猜这是为了防止 Godbolt 认为这是一条评论:

  do { uint32_t primask = DisableGlobalIRQ(); do { i += 2; quux(); } while (0); EnableGlobalIRQ(primask); } while (0);

我认为这种差异不存在任何合规性问题,因为在这两种情况下 token 的顺序是相同的。

关于c - 我的分号怎么了? (gcc 预处理器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67274745/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com