Приведение константы к объединению
Вопрос
Следующий код:
#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)
допустимое rvalue типаval_t
?
Также было бы интересно узнать, поддерживается ли такое поведение другими компиляторами (или, по крайней мере, MS Visual C ++).Кто-нибудь знает?
Редактировать:Приведение к объединению - это расширение GCC, поэтому использовать его не очень хорошая идея.
Спасибо Маурицу и Нилу!Я не думал об использовании -pedantic для проверки!
Решение
В Расширения языка GNU C приведение к объединению помечено как расширение стандарта C.Так что, скорее всего, вы не найдете его в C99 или любом другом стандарте C.Компилятор IBM C также поддерживает это расширение.
Другие советы
[neilb@GONERIL NeilB]$ gcc -Wall -pedantic sw.c
sw.c: In function 'main':
sw.c:11: warning: ISO C forbids casts to union type
sw.c:12: warning: ISO C forbids casts to union type