سؤال

الرمز التالي:

#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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top