"عملية المقبس على غير مقبس" خطأ بسبب بناء الجملة الغريب
سؤال
ركضت عبر الخطأ 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) {