Я попытался прочитать релевантные разделы стандарта (secs 6.5 и 6.8 из c99), но это привело меня к более запутанному и без четкого ответа. Это код, о котором идет речь:Операторы блоков, запятые и управляющие выражения в C
#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: Ради readabilty следовать соглашению использовать капиталы для '# define's:' #define BLOCK ... 'but' #define block ... ' – alk
Сочетание выражений выражения' ('и'}) в этом случае действительно плохое. Gcc люди должны, по крайней мере, создать специальные жетоны, которые препятствуют такой вещи. –