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