Литье константы в союз

Следующий код:

#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 для проверки!

Ответ 1

В Расширения языка GNU C приведение в союз помечено как расширение стандарта C. Поэтому, скорее всего, вы не найдете его в C99 или любом другом стандарте C. Компилятор IBM C также поддерживает это расширение.

Ответ 2

[[email protected] 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