"عملية المقبس على غير مقبس" خطأ بسبب بناء الجملة الغريب

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

  •  28-09-2019
  •  | 
  •  

سؤال

ركضت عبر الخطأ Socket operation on non-socket في بعض رمز الشبكات الخاص بي عند الاتصال connect وقضى الكثير من الوقت في محاولة لمعرفة سبب ذلك. لقد اكتشفت أخيرًا أن السطر التالي من الكود كان يسبب المشكلة:

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol) < 0)) {

ترى المشكلة؟ إليك ما يجب أن يبدو عليه الخط:

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {

ما لا أفهمه هو السبب في أن الخط الأول غير الصحيح لا ينتج تحذيرًا. بعبارة أخرى ، لا ينبغي للشكل العام:

if ( foo = bar() < baz ) do_something();

تبدو غريبًا للمترجم ، وخاصة الجري مع g++ -Wall -Wextra?

إذا لم يكن الأمر كذلك ، فلا ينبغي أن تظهر على الأقل كـ "نمط سيء" لـ CppCheck ، وهو ما أقوم أيضًا بتشغيله كجزء من التجميع الخاص بي؟

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

المحلول

في الواقع ، لا تحصل على أي تحذير بسبب الأقواس المزدوجة (.

حاول إزالة زوج واحد ، وسوف تحصل على التحذير.

#include <iostream>

int foo()
{
    return 2;
}

int main(int /*argc*/, char** /*argv*/)
{
    int l;

    if ((l = foo() < 3)) // Won't generate warning under gcc
    {
    }

    if (l = foo() < 3) // will generate a warning "warning: suggest parentheses around assignment used as truth value"
    {
    }

    return EXIT_SUCCESS;
}

لتجنب مثل هذه الأخطاء المزعجة/الأخطاء المطبعية ، أتجنب تعيين قيمة واختبارها في نفس البيان. هذا الكثير من الخطأ عرضة IMHO.

نصائح أخرى

هذا أحد الأسباب التي تجعلني أحاول ألا أفعل الكثير في بيان واحد. بدلاً من

if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {

لما لا:

sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)
if(sockfd < 0) {
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top