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

متى تتطلب قائمة تهيئة نوع C ++ نوع الأقواس الخارجية؟

نشر في 2025-04-14
تصفح:706

When are Outer Braces Necessary in C   Initializer Lists for Aggregates?

الارتباك حول حذف الأقواس الخارجية في قوائم المهيمنة للركام وهياكل الجراب

في عالم البرمجة C ، ينشأ سؤال شائع فيما يتعلق باستخدام أقواس الأبعاد. على وجه التحديد ، قد يواجه المبرمجون سيناريوهات حيث يبدو أن الأقواس الخارجية مطلوبة لأنواع إجمالية معينة ولكن ليس للآخرين. تهدف هذه المقالة إلى التعمق أكثر في الموضوع وتقديم توضيح حول متى يمكن حذف الأقواس الخارجية.

المشكلة

{ int foo شريط مزدوج } ؛ Std :: Array A1 = // خطأ C2078: الكثير من المهيئات { {0 ، 0.1} ، {2 ، 3.4} } ؛ // نعم std :: Array a2 = {0.1 ، 2.3} ؛

يشير الخطأ إلى أن هناك الكثير من المهيئات لـ A1 ، مما يشير إلى أن الأقواس الإضافية مطلوبة. ومع ذلك ، فإن حذف الأقواس الخارجية لـ A2 لا يؤدي إلى خطأ. يثير هذا التناقض السؤال عن سبب حاجة إلى أقواس خارجية لـ A1 ولكن ليس لـ A2. تم تصنيف std :: Array على أنها مجموعة بيانات قديمة (POD) ، في حين أن حاويات المكتبة القياسية الأخرى ليست كذلك. على عكس الحاويات التي تحتوي على مُنشئين من المعرفة من قبل المستخدم ، لا تحتوي Array على الحاويات. أول عضو في البيانات هو مجموعة من الحجم n ، محددة كوسيطة قالب. يتم تهيئة عضو البيانات هذا مباشرة باستخدام قائمة المهيمنة. الأقواس الإضافية ضرورية لأنها ترفع الصفيف الداخلي الذي يتم تهيئته.
struct A
{
    int foo;
    double bar;
};

std::array a1 = 
  // error C2078: too many initializers
  {
    {0, 0.1},
    {2, 3.4}
  };

// OK
std::array a2 = {0.1, 2.3};
لتوضيح هذا المفهوم بشكل أكبر ، فكر بنية Aarray { بيانات [2] ؛ // صفيف داخلي } ؛

يتطلب تهيئة هذا الهيكل استخدام الأقواس للدلالة على بداية ونهاية الصفيف الداخلي الذي يتم تهيئته: { {// يبدأ تهيئة الصفيف الداخلي {// تهيئة العنصر الأول من الصفيف الداخلي 0 ، 0.1 } ، // ينتهي تهيئة العنصر الأول {2 ، 3.4} // تهيئة العنصر الثاني من الصفيف الداخلي } // ينتهي تهيئة الصفيف الداخلي } ؛ // خطأ: عدد كبير جدًا من عمليات التهيئة إذا لم تستخدم الأقواس Aarray B1 = { 0 ، 0.1 ، 2 ، 3.4 } ؛

حالة Double

في حالة std :: array ، الموقف مختلف لأن المزدوج ليس نوعًا إجماليًا. بدلاً من ذلك ، يعتبر std :: array مجموعة من البدائية. الرمز التالي صالح بدون أقواس خارجية لأنه يتم تهيئة القيم البدائية مباشرةً داخل المجلة:

std :: array a2 = {0.1 ، 2.3} ؛
struct A
{
    int foo;
    double bar;
};

std::array a1 = 
  // error C2078: too many initializers
  {
    {0, 0.1},
    {2, 3.4}
  };

// OK
std::array a2 = {0.1, 2.3};
ينص القسم §8.5.1/11 من مواصفات C 11 على أنه إذا بدأت قائمة التهيئة مع دعامة يسارية ، فإن كل قائمة مفصولة في الفاصلة اللاحقة لسلالات التهيئة تهيئة أعضاء مجموعة فرعية. من ناحية أخرى ، إذا لم تبدأ قائمة التهيئة للفرع الفرعي مع الدعامة اليسرى ، فسيتم أخذ ما يكفي من سلالات التهيئة فقط لتهيئة الأعضاء الفرعية ، مع أي خلايا تهيئة متبقية

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

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3