【发布时间】:2023-11-24 15:08:02
【问题描述】:
我尝试阅读标准的相关部分(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 吗?它在 clang 和 gcc 上编译而不会产生任何错误,即使设置了 -Wall 和 -Wextra。
【问题讨论】:
-
这是我不希望看到的代码类型——即使它可以编译 ^_^
-
OT:为了便于阅读,请按照惯例为
#defines 使用大写字母:#define BLOCK ...但#define block ... -
以这种方式组合语句表达式的
({和})是非常糟糕的风格。 Gcc 的人至少应该创建特殊的令牌来禁止这种事情。 -
@claptrap 我下。我这样写是为了更好地说明我的问题。