Кастинг константы к объединению

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

#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?

Также было бы интересно знать, поддерживается ли это поведение другими компиляторами (или по крайней мере Visual C++ MS). Кто-либо знает?

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

Благодаря Maurits и Neil! Я не думал об использовании - педантичный проверять!

15
задан Ralf Stubner 25 July 2018 в 14:17
поделиться

2 ответа

Всегда полезно использовать метод redirect-after-post. Это предотвращает случайную повторную отправку формы с помощью функции обновления из браузера. Это также полезно даже при использовании хеш-метода. Это потому, что без перенаправления после POST, в случае нажатия кнопки Back/Refresh, пользователь увидит сообщение с вопросом о повторной подаче формы, что может запутать ее.

Если вы выполняете переадресацию GET после каждой процедуры POST, то при нажатии кнопки «Назад/Обновить» это сообщение не отображается (для обычного пользователя). Поэтому для полной защиты используйте Hash + перенаправление после публикации.

-121--2271308-

другое использование - простые счетчики, такие как: perl -e 'foreach (1.. 100) {print «$ _\n»} '

-121--3702235-

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

6
ответ дан 1 December 2019 в 04:47
поделиться
[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
ответ дан 1 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: