Вопрос

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

#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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top