هل من الممكن (قانونية) تعيين اتحاد مجهول في مركب حرفي؟

StackOverflow https://stackoverflow.com/questions/1885854

سؤال

لدي بنية:

typedef struct _n
{
    int type;
    union {
        char *s;
        int i;
    };
} n;

عندما أحاول تعيين مركب حرفي، مثل:

node n1 = {1, 0};
node n2 = {2, "test"};

تعطيني دول مجلس التعاون الخليجي بعض التحذيرات مثل:

warning: initialization makes pointer from integer without a cast
warning: initialization from incompatible pointer type

حسنا، من الواضح أن المترجم غير متأكد مني مجرد تعيين قيمة إلى نوع غامض ربما. ومع ذلك، حتى لو حاولت تحديد أكثر دقة:

node n0 = {type: 1, i: 4};

انا حصلت:

error: unknown field ‘i’ specified in initializer

لقد قرأت ذلك إذا وضعت (union <union name>) قبل i: ثم قد تعمل. ومع ذلك، أفضل وجود اتحاد مجهول. هل هناك طريقة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

النقابات المجهولة ليست قياسية C - أنها ملحق مترجم. أود أن أوصي بشدة إعطاء الاتحاد اسم. إذا كنت تصر على استخدام اتحاد مجهول، فيمكنك فقط إعطاء تهيئة للعنصر الأول منه:

node n0 = {1, 0};  // initializes `s' to 0

عندما جمعت مع -Wall -Wextra -pedantic, ، أعطاني دول مجلس التعاون الخليجي تحذير "الأقواس المفقودة حول المهادة"، وهو تحذير صالح. يجب تحديد المهيمة بالفعل مثل هذا:

node n0 = {1, {0}};  // initializes `s' to 0

الآن هذا يعطي فقط تحذيرا من أن "ISO C لا يدعم الهياكل / النقابات غير المسماة".

إذا قمت بإعطاء الاتحاد اسما، فيمكنك استخدام ميزة C99 تسمى المهيئين المعينين لتهيئة عضو معين في الاتحاد:

typedef struct
{
    int type;
    union {
        char *s;
        int i;
    } value;
} node;

node n0 = {1, { .s = "string"; }};
node n1 = {2, { .i = 123; }};

تحتاج إلى الاتحاد للحصول على اسم؛ خلاف ذلك، سوف يشكو المحول البرمجي من تهيئة المعينة داخلها.

بناء الجملة الذي كنت تحاول استخدامه node n0 = {type: 1, i: 4} هو بناء جملة غير صالح؛ يبدو أنك تحاول استخدام المهيئات المعينة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top