我试过阅读标准的相关部分(c99的6.5和6.8),但这让我更加困惑,没有明确的答案。这是有问题的代码:
#include <stdio.h>
#include <time.h>
int t;
#define block {\
int temp = 1; \
t = time(NULL); \
if (t == (time_t) -1 && temp) puts("turbulance ahead!");\
}
int main(){
if (((block), t%2)) {
puts("nice 'n even");
}
else {
puts("odd..");
}
return 0;
}
代码有效吗c99 / c1x?即使设置了-Wall和-Wextra,它也会在clang和gcc上编译而不会产生任何错误。
答案 0 :(得分:4)
没有。它在标准C(C99 / C11)下无效。
它在GNU C中有效,这是一个名为statement expressions的扩展名。
答案 1 :(得分:1)
它在clang和gcc上编译
不,它没有。将其编译为C语言,而不是作为&#34; GNU goo&#34;语言。
gcc file.c -std=c99 -pedantic-errors -Wall -Wextra
答案 2 :(得分:0)
if (((block), t%2))
这将计算一个语句表达式,后跟一个逗号运算符。块表达式的返回值是块中最后一个语句的值。逗号运算符从左到右进行求值,其值等于最后一个表达式。如果您在gcc中尝试-E选项,您将获得预处理代码,如下所示:
if ((({ int temp = 1; t = time(((void *)0)); if (t == (time_t) -1 && temp) puts("turbulance ahead!");}), t%2))
因此if语句中的条件仅由t%2的值决定(按照逗号运算符)。
Is the code valid c99/c1x?
没有。 C99为语句表达式生成警告。