سؤال

(أنا أستخدم Visual C++ 2008) لقد سمعت دائمًا أن main() هو مطلوب لإرجاع عدد صحيح، ولكن هنا لم أضعه return 0; وقد تم تجميعها مع 0 أخطاء و0 تحذيرات!في نافذة التصحيح تقول أن البرنامج قد خرج بالرمز 0.إذا تم تسمية هذه الدالة بأي شيء آخر غير main()، فسيشكو المترجم من أن 'blah' يجب أن يُرجع قيمة.الالتصاق أ return; يؤدي أيضًا إلى ظهور الخطأ.ولكن تركها بالكامل، فإنه يجمع على ما يرام.

#include <iostream>
using namespace std;

int main()
{
    cout << "Hey look I'm supposed to return an int but I'm not gonna!\n";
}

هل يمكن أن يكون هذا خطأ في VC++؟

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

المحلول

3.6.1 الوظيفة الرئيسية

....

2 لا يجب أن يحدد التنفيذ مسبقًا main وظيفة.لا يجوز تحميل هذه الوظيفة بشكل زائد.يجب أن يكون لها نوع الإرجاع من النوع int, ، ولكن بخلاف ذلك فإن نوعه محدد بالتنفيذ.يجب أن تسمح جميع التطبيقات بالتعريفين الرئيسيين التاليين:

int main() { /* ... */ }

و

int main(int argc, char* argv[]) {
/* ... */
}

....ويستمر في الاضافة ...

5 أ return بيان في main له تأثير ترك الوظيفة الرئيسية (تدمير أي كائنات ذات مدة تخزين تلقائية) والاتصال exit مع قيمة الإرجاع كوسيطة. إذا وصلت السيطرة إلى نهاية main دون مواجهة بيان الإرجاع، يكون التأثير هو تنفيذ الإرجاع 0;

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

نصائح أخرى

هذا جزء من معيار لغة C++.يتم إنشاء إرجاع ضمني 0 لك إذا لم يكن هناك عبارة إرجاع صريحة بشكل رئيسي.

أنا متأكد تمامًا من أن VC++ يقوم فقط بإدراج الإرجاع 0 إذا لم تقم بتضمين واحد في الوظائف الرئيسية.يمكن أن يحدث نفس الشيء مع الوظائف أيضًا، ولكن في هذه الحالات على الأقل ستتلقى تحذيرًا.

ينص القسم 6.6.3/2 على أن "التدفق من نهاية الدالة يعادل إرجاعًا بلا قيمة؛وينتج عن هذا سلوك غير محدد في دالة إرجاع القيمة.".

مثال على ذلك هو الكود أدناه الذي يعطي في أحسن الأحوال تحذيرًا على VS 2010/g++

int f(){
   if(0){
      if(1)
         return true;
   }
}

int main(){
   f();
}

لذا فإن بيت القصيد هو أن كلمة "الرئيسية" خاصة كما أشارت الردود السابقة.

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