هل هناك أي سبب لاستخدام الكلمة الأساسية "تلقائي" في C++ 03؟

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

  •  20-08-2019
  •  | 
  •  

سؤال

ملحوظة تم نشر هذا السؤال في الأصل في عام 2009، قبل التصديق على C++ 11 وقبل معنى auto تم تغيير الكلمة الرئيسية بشكل جذري.الإجابات المقدمة تتعلق فقط إلى معنى C++ 03 auto - أن تكون فئة تخزين محددة - وليس معنى C++ 11 لـ auto - هذا هو خصم النوع التلقائي.إذا كنت تبحث عن نصيحة حول موعد استخدام C++ 11 auto, ، هذا السؤال لا علاقة له بهذا السؤال.

لفترة طويلة اعتقدت أنه لا يوجد سبب لاستخدام static الكلمة الأساسية في لغة C، لأن المتغيرات المعلنة خارج نطاق الكتلة كانت عمومية ضمنيًا.ثم اكتشفت أن الإعلان عن متغير كـ static داخل نطاق الكتلة سيمنحه مدة دائمة، والإعلان عنه خارج نطاق الكتلة (في نطاق البرنامج) سيمنحه نطاق الملف (لا يمكن الوصول إليه إلا في وحدة الترجمة تلك).

لذلك يترك لي هذا كلمة رئيسية واحدة فقط (ربما) لم أفهمها بالكامل بعد:ال auto الكلمة الرئيسية.هل هناك معنى آخر لها غير "المتغير المحلي"؟ أي شيء يفعله لا يتم القيام به ضمنيا من أجلك أينما كنت ترغب في استخدامه؟كيف يمكن ل auto متغير يتصرف في نطاق البرنامج؟ماذا من أ static auto متغير في نطاق الملف؟هل لهذه الكلمة الرئيسية أي غرض آخر غير موجودة فقط من أجل الاكتمال?

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

المحلول

وauto هو تخزين الطبقة محدد، static، register وextern جدا. يمكنك استخدام واحد فقط من هذه الأربعة في الإعلان.

والمتغيرات المحلية (بدون static) لديها مدة التخزين التلقائي، وهو ما يعني أنها تعيش منذ بداية تعريفها حتى نهاية كتلة بهم. وضع السيارات أمامهم لا لزوم لها منذ ذلك هو الافتراضي على أي حال.

وأنا لا أعرف أي سبب لاستخدامه في C ++. في الإصدارات C القديمة التي لديها حكم كثافة ضمنية، يمكن استخدامه لتعريف متغير، كما في:

int main(void) { auto i = 1; }

لجعلها جملة صالح أو إزالة الغموض من تعبير الاحالة في حالة i في نطاقها. ولكن هذا لا يعمل في C ++ على أي حال (لديك لتحديد نوع). مضحك بما فيه الكفاية، المعيار C ++ يكتب:

<اقتباس فقرة>   

وأعلن كائن دون تخزين الطبقة محدد في نطاق كتلة أو أعلن كمعلمة الدالة على مدة التخزين التلقائي بشكل افتراضي. [ملاحظة: وبالتالي، فإن محدد السيارات هو دائما تقريبا زائدة عن الحاجة وليس غالبا ما تستخدم. استخدام واحدة من السيارات هو التمييز إعلانا-بيان من التعبير عن بيان (6.8) بشكل صريح. - مذكرة نهاية]

والتي تشير إلى السيناريو التالي، والتي يمكن أن تكون إما المدلى بها من a إلى int أو إعلان a متغير من نوع int وجود أقواس زائدة حول a. دائما اتخذتها ليكون إعلانا، لذلك auto لا تضيف أي شيء مفيد هنا، ولكن سيكون للإنسان، بدلا من ذلك. ولكن مرة أخرى، فإن الإنسان سيكون أفضل حالا إزالة الأقواس زائدة حول a، وأود أن أقول:

int(a);

ومع معنى جديدا من auto يصلون مع C ++ 0X، وأود أن تثبط استخدامه مع معنى C ++ 03 في التعليمات البرمجية.

نصائح أخرى

في C ++ 11، auto له معنى جديد: لأنها تتيح لك أن نستنتج تلقائيا نوع متغير

لماذا هو أن فائدة من أي وقت مضى؟ دعونا النظر في مثال بسيط:

std::list<int> a;
// fill in a
for (auto it = a.begin(); it != a.end(); ++it) {
  // Do stuff here
}

ووauto هناك يخلق مكرر من نوع std::list<int>::iterator.

وهذا يمكن أن يجعل بعض التعليمات البرمجية المعقدة على محمل الجد أسهل بكثير للقراءة.

ومثال آخر:

int x, y;
auto f = [&]{ x += y; };
f();
f();

وهناك، وauto استنتاجها النوع المطلوب لتخزين التعبير امدا في متغير. ويكيبيديا لديها جيدة تغطية حول هذا الموضوع.

والكلمة السيارات ليس لها غرض في الوقت الراهن. أنت على حق تماما أنه مجرد يكرر الطبقة التخزين الافتراضي من متغير محلي، ومفيدة حقا بديل يجري static.

العلامة التجارية الجديدة معنى في C ++ 0X. والتي تمنحك فكرة عن مدى عديمة الفائدة كان!

دول مجلس التعاون الخليجي لديها استخدام خاص ل auto للوظائف المتداخلة - انظر هنا.

إذا كانت لديك دالة متداخلة تريد استدعاؤها قبل تعريفها، فستحتاج إلى الإعلان عنها auto.

و"تلقائي" من المفترض أن يقول المترجم أن تقرر لنفسها مكان وضع متغير (الذاكرة أو التسجيل). التناظرية هو "تسجيل"، التي من المفترض أن يقول المترجم في محاولة لإبقائه في السجل. المجمعين الحديثة تتجاهل حد سواء، لذلك يجب عليك أيضا.

وأنا استخدم هذه الكلمة الرئيسية لتوثيق صراحة عندما أمر بالغ الأهمية من أجل وظيفة، أن المتغير وضعها على المكدس، لمعالجات القائم على المكدس. يمكن أن يكون مطلوبا هذه الوظيفة عند تعديل كومة قبل عودته من وظيفة (أو المقاطعة خدمة روتين). في هذه الحالة أنا نعلن ما يلي:

auto unsigned int auiStack[1];   //variable must be on stack

وبعد ذلك يمكنني الوصول إلى خارج متغير:

#define OFFSET_TO_RETURN_ADDRESS 8     //depends on compiler operation and current automatics
auiStack[OFFSET_TO_RETURN_ADDRESS] = alternate_return_address;

وهكذا الكلمة auto يساعد توثيق القصد.

ووفقا لStroustrup، في "C برمجة اللغة" (4th الطبعة، التي تغطي C 11)، واستخدام "السيارات" لديه أسباب الرئيسية التالية (القسم 2.2.2) (مدرجة الكلمات Stroustrup):

1)

<اقتباس فقرة>   

وهذا التعريف هو في نطاق واسع حيث أننا نريد أن نجعل نوع   واضحة للعيان للقراء من التعليمات البرمجية لدينا.

ومع "السيارات" ومهيئ لها الضروري يمكننا أن نعرف نوع المتغير في لمحة!

2)

<اقتباس فقرة>   

ونحن نريد أن تكون واضحة حول مدى متغير أو الدقة (على سبيل المثال، انقر نقرا بدلا من تعويم)

في رأيي القضية التي تناسبها هنا، هو شيء من هذا القبيل:

   double square(double d)
    {
        return d*d; 
    }

    int square(int d)
    {
        return d*d; 
    }

    auto a1 = square(3);

    cout << a1 << endl;

    a1 = square(3.3);

    cout << a1 << endl;

3)

<اقتباس فقرة>   

واستخدام 'السيارات' نتجنب التكرار وكتابة أسماء الأنواع طويلة.

وتخيل بعض طويل اسم نوع من مكرر templatized:

و(رمز من قسم 6.3.6.1)

template<class T> void f1(vector<T>& arg) {
    for (typename vector<T>::iterator p = arg.begin(); p != arg.end();   p)
        *p = 7;

    for (auto p = arg.begin(); p != arg.end();   p)
        *p = 7;
}

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

ويوصف معنى جديدا لكلمة رئيسية لصناعة السيارات في C ++ 0X متقن مايكروسوفت ستيفان T. Lavavej في مواضيعها بحرية محاضرة فيديو تحميل / على STL وجدت في موقع قناة 9 MSDN في <لأ href = "HTTP: // channel9.msdn.com/shows/Going+Deep/C9-Lectures-Introduction-to-STL-with-Stephan-T-Lavavej/ "يختلط =" نوفولو "عنوان =" هنا "> هنا .

والمحاضرة يستحق المشاهدة في مجملها، ولكن الجزء حول الكلمة السيارات هو في حوالي علامة دقيقة ال29 (تقريبا).

هل هناك معنى آخر إلى "السيارات" بخلاف "المتغير المحلي؟

وليس في C ++ 03.

كل شيء فإنه التي لم يتم ذلك ضمنا بالنسبة لك أينما كنت قد ترغب في استخدامه؟

لا شيء على الإطلاق، في C ++ 03.

كيف تتصرف متغير السيارات في نطاق البرنامج؟ ما من متغير السيارات ثابت في ملف النطاق؟

لا يسمح كلمة خارج وظيفة / طريقة الجسم.

هل لدى هذه الكلمة لأي غرض [في C ++ 03] البعض من مجرد القائمة للتأكد من اكتمالها؟

والمثير للدهشة، نعم. وتضمنت معايير التصميم C ++ درجة عالية من التوافق مع كان C. C هذه الكلمة وانه لا يوجد سبب حقيقي لمنعه أو إعادة تعريف معناها في C ++. لذا، كان الهدف واحد أقل التعارض مع C.

هل لدى هذه الكلمة لأي غرض في C الآخرين من مجرد القائمة للتأكد من اكتمالها؟

وتعلمت واحد فقط في الآونة الأخيرة: سهولة ترقية البرامج القديمة من B. C تطورت من لغة تسمى B التي كانت مشابهة تماما لتلك التي C. ومع ذلك، كان B أي أنواع من أي نوع في بناء الجملة. وكانت الطريقة الوحيدة لتعريف متغير في B لتحديد نوع التخزين (auto أو extern). مثل هذا:

<اقتباس فقرة>   

والسيارات ط.

وبناء الجملة هذا لا يزال يعمل في C وما يعادل

<اقتباس فقرة>   

وكثافة العمليات ط؛

ولأن في C، والتخلف عن فئة تخزين لauto، ونوع من التخلف إلى int. انا اعتقد ان كل برنامج واحد التي نشأت في B واستدار إلى C مليئة حرفيا من المتغيرات auto في ذلك الوقت.

وC ++ 03 لم يعد يسمح للكثافة العمليات الضمني C النمط، لكنه حافظ على الكلمة auto عدم أطول-مفيدة تماما لأنه على عكس كثافة العمليات الضمني، ولم يعرف أن يسبب أي مشكلة في بناء جملة C.

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