Следующий код:
#include <stdio.h>
typedef union {
int n;
char *s;
} val_t;
int main(void) {
val_t v1,v2;
v1 = (val_t)"Hello World";
v2 = (val_t)10;
printf("%s %d\n", v1.s, v2.n);
return(1);
}
компилируется и выполняется правильно с помощью gcc. Если кто-то пытается указать константу, для которой нет подходящего поля в объединении, создается сообщение об ошибке.
Однако, глядя на стандарт (C99), я не смог найти раздел, где описано это поведение. Следовательно, мой вопрос:
Является ли стандарт C гарантией, что я могу использовать константу для типа объединения, при условии, что тип объединения имеет поле с совместимым типом?
или, другими словами:
Является
((val_t)10)
допустимым значением типаval_t
?
Было бы также интересно узнать, поддерживается ли это поведение другими компиляторами (или, по крайней мере, MS Visual С++). Кто-нибудь знает?
EDIT: Кастинг в объединение - это расширение GCC, поэтому не рекомендуется использовать его.
Благодаря Маурицу и Нилу! Я не думал об использовании -pedantic для проверки!