Приведение константы в союз - PullRequest
15 голосов
/ 27 января 2010

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

#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 C ++). Кто-нибудь знает?

EDIT: Приведение к объединению является расширением GCC, поэтому его не рекомендуется использовать.

Спасибо Морицу и Нилу! Я не думал об использовании -pedantic для проверки!

Ответы [ 2 ]

6 голосов
/ 27 января 2010
[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
6 голосов
/ 27 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...