هل هناك فرق بين foo(void) وfoo() في C++ أو C؟
سؤال
خذ بعين الاعتبار هذين التعريفين للوظيفة:
void foo() { }
void foo(void) { }
هل هناك فرق بين هذين؟إذا لم يكن كذلك، لماذا void
حجة هناك؟أسباب جمالية؟
المحلول
في ج:
void foo()
يعني "وظيفةfoo
أخذ عدد غير محدد من الوسائط من نوع غير محدد"void foo(void)
يعني "وظيفةfoo
لا تأخذ أي حجج"
في سي ++:
void foo()
يعني "وظيفةfoo
لا تأخذ أي حجج"void foo(void)
يعني "وظيفةfoo
لا تأخذ أي حجج"
عن طريق الكتابة foo(void)
, لذلك، فإننا نحقق نفس التفسير عبر كلتا اللغتين ونجعل رؤوسنا متعددة اللغات (على الرغم من أننا نحتاج عادةً إلى القيام ببعض الأشياء الإضافية على الرؤوس لجعلها مشتركة بين اللغات حقًا؛وهي لفها في extern "C"
إذا كنا نقوم بتجميع C++).
نصائح أخرى
أدرك أن سؤالك يتعلق بـ C++، ولكن عندما يتعلق الأمر بـ C، يمكن العثور على الإجابة في K&R، الصفحات 72-73:
علاوة على ذلك ، إذا لم يتضمن إعلان الوظيفة حججًا ، كما في
double atof();
هذا أيضًا يعني أنه لا يوجد شيء يجب افتراضه حول حجج ATOF ؛تم إيقاف فحص جميع المعلمات.يهدف هذا المعنى الخاص لقائمة الوسيطة الفارغة إلى السماح لبرامج C القديمة بالتجميع مع المترجمين الجدد.لكنها فكرة سيئة لاستخدامها مع برامج جديدة.إذا كانت الدالة تأخذ وسائط، قم بإعلانها؛إذا لم يتطلب الأمر أي وسيطات ، فاستخدم void.
المسودة القياسية C++11 N3337
ليس هناك فرق.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
الملحق ج "التوافق" ج.1.7 البند 8:المعلنين يقول:
8.3.5 التغيير:في C ++، الدالة المعلنة بقائمة معلمات فارغة لا تأخذ أي وسائط.في C ، تعني قائمة المعلمات الفارغة أن الرقم ونوع وسيطات الوظائف غير معروفين.
مثال:
int f(); // means int f(void) in C ++ // int f( unknown ) in C
الأساس المنطقي:هذا لتجنب مكالمات الوظائف الخاطئة (أي مكالمات الوظائف مع الرقم الخاطئ أو نوع الوسائط).
التأثير على الميزة الأصلية:التغيير إلى دلالات الميزة المحددة جيدًا.تم وضع علامة على هذه الميزة على أنها "متقادمة" في C.
8.5.3 الوظائف يقول:
4.يحدد بن ترميم المعلمة الوسائط التي يمكن تحديدها ، ومعالجتها ، عندما يتم استدعاء الوظيفة....] إذا كان بن ترميم المعلمة فارغًا ، فلا تأخذ الوظيفة أي وسيطات.قائمة المعلمات (باطلة) تعادل قائمة المعلمات الفارغة.
C99
كما ذكر C++ 11، int f()
لا يحدد أي شيء عن الحجج، وهو عفا عليه الزمن.
يمكن أن يؤدي إما إلى كود العمل أو UB.
لقد قمت بتفسير معيار C99 بالتفصيل على: https://stackoverflow.com/a/36292431/895245
في لغة C، يمكنك استخدام فراغ في مرجع دالة فارغ بحيث يكون لدى المترجم نموذج أولي، وهذا النموذج الأولي لا يحتوي على "وسائط".في لغة C++، ليس عليك أن تخبر المترجم أن لديك نموذجًا أوليًا لأنه لا يمكنك ترك النموذج الأولي.