سؤال

لقد صادفت مؤخرًا اتفاقية ترميز غير عادية إلى حد ما حيث تكون الدعوة لإرجاع وظيفة "void" مسبقة بـ (void).

على سبيل المثال

(void) MyFunction();  

هل هو مختلف عن استدعاء الوظيفة مثل:

MyFunction();  

هل حصلت على أي ميزة أم أنها أخرى لا داعي لها ولكن هناك اتفاقية ترميز من نوع ما؟

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

المحلول

تقوم بعض الوظائف مثل printf () بإرجاع قيمة لا يتم استخدامها أبدًا في التعليمات البرمجية الحقيقية (في حالة printf ، عدد الأحرف المطبوعة). ومع ذلك ، بعض الأدوات ، مثل الوبر, ، توقع أنه إذا أدت الدالة إلى إرجاع قيمة ، فيجب استخدامها ، وسوف تشكو ما لم تكتب شيئًا مثل:

int n = printf( "hello" );

باستخدام طاقم الفراغ:

(void) printf( "hello" );

هي وسيلة لإخبار مثل هذه الأدوات التي لا ترغب حقًا في استخدام قيمة الإرجاع ، وبالتالي إبقائها هادئة. إذا لم تستخدم مثل هذه الأدوات ، فلن تحتاج إلى الإزعاج ، وعلى أي حال تسمح لك معظم الأدوات بتكوينها لتجاهل قيم الإرجاع من وظائف محددة.

نصائح أخرى

لا ، ليس هناك أي فرق - ما يتم إلقاؤه في الفراغ هو قيمة إرجاع الوظيفة.

أود أن أقول أنه يمكن أن يفهم أنك تريد أن تضع صريحًا أنك لا تستخدم قيمة الإرجاع (أنت تتصل بها للآثار الجانبية) ، ولكن نظرًا لأن الوظيفة لها عودة باطلة بالفعل ، فهي ليست منطقية كثيرًا .

إذا أدت الوظيفة إلى إرجاع شيء يمكن أن يتجنب الفراغ (!) تحذيرًا (في الواقع لم أتمكن بأي حال من الأحوال ، تحذرني مجلس التعاون الخليجي من فقدان قيمة الإرجاع) على بعض المجمعين (أو أدوات الوبر) ؛ ولكن الأهم من ذلك ، من الواضح أن قيمة الإرجاع "يتم إلقاؤها" عن قصد (وليس عن طريق الخطأ).

Acedemically: "وظيفة" تُرجع شيئًا دائمًا ، وإلا فإن ذلك سيكون إجراءً. لذا فإن مؤلف هذا الرمز يريد أن يقول "أعرف أن هذا التسمية خاطئ ، لكنني لن أغير الاسم ، لذلك أجعل هذا الاضطراب مرئيًا"

هل حصلت على أي ميزة أم أنها أخرى لا داعي لها ولكن هناك اتفاقية ترميز من نوع ما؟

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

في صفحات HPUX MAN ، من الشائع جدًا في رمز المثال أن نرى فريقًا يفرغ للالتفاف على تحذيرات الوبر.

fprintf(mystream, "%s\n", "foo");

ضد.

(void)fprintf(mystream, "%s\n", "foo");

قد يكون هذا هو المكان الذي يأتي منه مؤلف الكود. IMO ، هذه ليست فكرة رائعة لأن معظم عائلة Sprintf ، على سبيل المثال ، اتصل بـ Malloc. سوف تفشل Malloc عندما لا يكون هناك ما يكفي من الذاكرة. يتسبب SIGINT أيضًا في مقاطعة SYSCALL الكامنة () لمقاطعة SYSCALL وعدم كتابة جميع المخزن المؤقت ، لأفراد الأسرة PRINTF ().

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