سؤال
الرمز التالي:
#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 ++). لا أحد يعرف؟
تحرير: إن الإلقاء على الاتحاد هو امتداد لجامعة كاليفورنيا ، لذلك ليس من الجيد استخدامه.
بفضل موريتس ونيل! لم أفكر في استخدام -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