لماذا يتم إلغاء قيم الإرجاع غير المستخدمة؟

StackOverflow https://stackoverflow.com/questions/689677

  •  22-08-2019
  •  | 
  •  

سؤال

int fn();

void whatever()
{
    (void) fn();
}

هل هناك أي سبب لإلغاء قيمة الإرجاع غير المستخدمة، أم أنني على حق في الاعتقاد بأنها مضيعة للوقت تمامًا؟

متابعة:

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

سأأكل كلامي إذا هربت حشرة بسببه..

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

المحلول

الإجابة حد كبير يغطي الدافع لهذا ، لتظهر بشكل واضح "للمطورين" الآخرين عليك أن تعرف هذه الوظيفة عوائد ولكن كنت تجاهل بشكل صريح.

وهذا هو وسيلة للتأكد من أن رموز الخطأ عند الضرورة يتم التعامل دائما.

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

class A {};
A operator+(A const &, A const &);

int main () {
  A a;
  a + a;                 // Not a problem
  (void)operator+(a,a);  // Using function call notation - so add the cast.

نصائح أخرى

وفي العمل الذي نقوم استخدام ذلك لنعترف بأن وظيفة لديها قيمة الإرجاع ولكن أكد المطور أنه آمن تجاهل ذلك. منذ كنت الموسومة مسألة ما C ++ يجب أن تستخدم static_cast :

static_cast<void>(fn());

وبقدر ما يتعلق الأمر مترجم يذهب الصب قيمة الإرجاع إلى إبطال له معنى يذكر.

والسبب الحقيقي للقيام بذلك يعود إلى أداة تستخدم على كود C، ودعا الوبر .

ويحلل كود تبحث عن المشاكل المحتملة والتحذيرات إصدار والاقتراحات. إذا وظيفة عادت قيمة وكان في حينها لم يكن محددا، فإن lint يحذر في حال كان هذا من قبيل الصدفة. لإسكات lint على هذا التحذير، يمكنك يلقي الدعوة إلى (void).

الصب ل void يتم استخدامه لمنع تحذيرات برنامج التحويل البرمجي للمتغيرات غير المستخدمة وقيم الإرجاع أو التعبيرات غير المحفوظة.

يقول المعيار (2003) في §5.2.9/4،

يمكن تحويل أي تعبير بشكل صريح إلى نوع "cv void". قيمة التعبير هي تم التخلص منها.

لذلك يمكنك الكتابة:

//suppressing unused variable warnings
static_cast<void>(unusedVar);
static_cast<const void>(unusedVar);
static_cast<volatile void>(unusedVar);

//suppressing return value warnings
static_cast<void>(fn());
static_cast<const void>(fn());
static_cast<volatile void>(fn());

//suppressing unsaved expressions
static_cast<void>(a + b * 10);
static_cast<const void>( x &&y || z);
static_cast<volatile void>( m | n + fn());

جميع النماذج صالحة.عادةً ما أجعلها أقصر على النحو التالي:

//suppressing  expressions
(void)(unusedVar);
(void)(fn());
(void)(x &&y || z);

لا بأس به أيضًا.

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

وأنا أعلم أن هذا هو موضوع قديم، ولكن مع تطور اللغة وتجدر الإشارة هنا للتأكد من اكتمالها أنه منذ ج ++ 17 لدينا السمة [[maybe_unused]] التي يمكن استخدامها بدلا من المدلى بها void.

ويلقي على باطل هو تقدر بثمن. ومن المعلومات الوحيدة للمترجم كيفية التعامل معها.

في C، فلا بأس تماما للادلاء بها باطل. تقريبا أي شخص سيفهم القصد من البيان.

في C ++، لديك غيرها من الأدوات تحت تصرفكم. وبما أن عبس يلقي C عادة عليها، وسوف منذ يلقي صريحا تبطل المرجح مفاجأة زملاء العمل الخاص بك (ومفاجآت الألغام)، ولدي هذا القالب وظيفة في مكان ما

template <typename T>
void use_expression(const T&) {}

وأنا أستخدم

...
use_expression(foo());

وحيث أود أن أكتب (void)foo() في C.

وأيضا عند التحقق من التعليمات البرمجية يتوافق إلى MISTA (أو غيرها) المعايير والأدوات الآلية مثل LDRA لن تسمح لك لاستدعاء دالة التي تحتوي على نوع إرجاع دون أن يكون ذلك إرجاع قيمة إلا إذا كنت يلقي صراحة القيمة التي تم إرجاعها إلى ( الفراغ)

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