Frage

Ich lief über den Fehler Socket operation on non-socket in einigen meiner Netzwerk-Code, wenn connect Aufruf und viel Zeit damit verbracht, um herauszufinden, was es verursacht wurde. Ich endlich herausgefunden, dass die folgende Zeile Code wurde das Problem verursacht:

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

Sehen Sie das Problem? Hier ist, was die Linie sollte wie folgt aussehen:

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

Was ich nicht verstehe, ist, warum die erste, falsche Linie erzeugt keine Warnung. Um es anders auszudrücken, sollte nicht die allgemeine Form:

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

seltsam aussehen an den Compiler, vor allem mit g++ -Wall -Wextra läuft?

Wenn nicht, sollte es nicht zumindest zeigen sich als „schlechter Stil“ zu cppcheck, die ich auch als Teil meiner Kompilierung renne?

War es hilfreich?

Lösung

Eigentlich Sie erhalten keine Warnung wegen der doppelten Klammer (.

Versuchen Sie, ein Paar zu entfernen, und Sie werden die Warnung zurück.

#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;
}

Um diese lästigen Fehler / Tippfehler zu vermeiden, vermeide ich einen Wert zuweisen und sie in der gleichen Aussage zu testen. Das ist zu viel fehleranfällig imho.

Andere Tipps

Das ist ein Grund, warum ich versuche, nicht zu viel in einer Erklärung zu tun. Statt

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

Warum nicht:

sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)
if(sockfd < 0) {
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top