【发布时间】:2017-02-03 00:10:03
【问题描述】:
我发现了以下构造,其中一个变量被分配给一个似乎是复合语句的东西,foo,在驱动程序中。为了比较,bar 产生未定义的行为,将相同的代码视为正确的函数。它似乎不符合我对 C 语言及其预处理器的理解,所以我怀疑它是 GCC 扩展。这里执行的逻辑是什么? (见输出here。)
#include <stdio.h>
#define foo(c) ({ int x = c; x; })
int bar(char c) {
int x = c;
x;
}
int main(void) {
int x = foo('0');
int y = bar('A');
printf("%d\n%d\n", x, y);
return 0;
}
输出:
48
0
【问题讨论】:
-
既然你已经怀疑是 gcc 扩展了,为什么在询问之前没有检查文档?你还做了什么来找出答案?
-
@Olaf 我确实尝试了广泛的搜索,但找不到产生结果的关键字。我能够从给定的函数版本中找到我怀疑的 UB 的来源,但这与宏版本不太一样。我浏览了 GCC 手册,但没有找到对其的具体参考,因为有足够多的扩展使线性搜索变得困难。此外,我还亲自咨询了一些不知道这个结构的同事。我相信我进行了足够多的研究来回答这个问题。
-
不到 5 分钟的搜索导致 gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html#Statement-Exprs 包括术语“声明”和“声明”,这正是您上面所拥有的。当涉及到编程和许多其他领域时,如何正确搜索是一项基本技能。旁注:见How to Ask,你应该在你的问题中表现出你的努力!
-
现在知道了答案,找到这个是微不足道的。昨天我的搜索能力似乎让我失望了。感谢您的反馈。
标签: c gcc c-preprocessor gcc-statement-expression