سؤال

خذ بعين الاعتبار هذين التعريفين للوظيفة:

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++، ليس عليك أن تخبر المترجم أن لديك نموذجًا أوليًا لأنه لا يمكنك ترك النموذج الأولي.

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