هل من الممكن (قانونية) تعيين اتحاد مجهول في مركب حرفي؟
-
19-09-2019 - |
سؤال
لدي بنية:
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}
هو بناء جملة غير صالح؛ يبدو أنك تحاول استخدام المهيئات المعينة.