استدعاء الوظيفة الرئيسية بشكل متكرر في لغة C
يوفر مقتطف الكود محاولات لاستدعاء الوظيفة الرئيسية () بشكل متكرر داخل نفسها في لغة C. ومع ذلك، من المهم ملاحظة أن هذا السلوك غير مسموح به في الامتثال الصارم للغة C.
هل الاتصال المتكرر بـ main() مسموح به في لغة C؟
وفقًا لمعيار C ، لا يمكن للوظيفة استدعاء نفسها مباشرة، بما في ذلك الوظيفة main(). يهدف هذا التقييد إلى منع التكرار اللانهائي وضمان إنهاء البرنامج.
التنفيذ العملي باستخدام g
على الرغم من معيار اللغة، فمن الممكن استدعاء main() بشكل متكرر في الممارسة العملية باستخدام مترجم GNU C (g ). لا يفرض g المعيار بشكل صارم في هذا الصدد، مما يسمح بالتجميع والتنفيذ للتعليمات البرمجية ذات استدعاءات main() العودية.
مثال التعليمات البرمجية
مقتطف التعليمات البرمجية المعدل التالي يوضح استدعاءات main() العودية باستخدام g :
#include
#include
using namespace std;
int main() {
int y = rand() % 10; // returns 3, then 6, then 7
cout عند تجميع هذا الكود وتنفيذه، سيولد هذا الكود المخرجات التالية:
y = 3
y = 6
y = 7
تحليل التجميع
يكشف فحص التجميع الذي تم إنشاؤه لهذا الكود أن g يتعامل مع استدعاءات main() العودية مثل أي استدعاء دالة آخر:
main:
...
cmpl $7, -12(%rbp)
je .L7
call main
...
.L7:
...
leave
ret
ملاحظة:
على الرغم من أن هذا السلوك ممكن مع g، فمن المهم ملاحظة أنه غير مضمون. قد يلتزم المترجمون الآخرون بشكل صارم بمعيار C، مما يؤدي إلى حدوث أخطاء في الترجمة أو سلوك غير متوقع. ولذلك، فإن استخدام استدعاءات main() العودية ليس ممارسة موصى بها.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3