Следующий код:
#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! Я не думал об использовании - педантичный проверять!
Всегда полезно использовать метод redirect-after-post. Это предотвращает случайную повторную отправку формы с помощью функции обновления из браузера. Это также полезно даже при использовании хеш-метода. Это потому, что без перенаправления после POST, в случае нажатия кнопки Back/Refresh, пользователь увидит сообщение с вопросом о повторной подаче формы, что может запутать ее.
Если вы выполняете переадресацию GET после каждой процедуры POST, то при нажатии кнопки «Назад/Обновить» это сообщение не отображается (для обычного пользователя). Поэтому для полной защиты используйте Hash + перенаправление после публикации.
-121--2271308- другое использование - простые счетчики, такие как:
perl -e 'foreach (1.. 100) {print «$ _\n»} '
В языковых расширениях 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