Question

J'ai couru à travers le Socket operation on non-socket d'erreur dans une partie de mon code réseau lors de l'appel connect et a passé beaucoup de temps à essayer de comprendre ce qui était à l'origine. J'ai finalement compris que la ligne de code suivante a été l'origine du problème:

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

Voir le problème? Voici ce que la ligne devrait ressembler à:

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

Ce que je ne comprends pas pourquoi la première ligne incorrecte ne produit pas d'avertissement. Pour mettre une autre manière, ne devrait pas la forme générale:

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

paraître étrange au compilateur, en particulier en cours d'exécution avec g++ -Wall -Wextra?

Dans le cas contraire, ne devrait pas au moins apparaître comme « mauvais style » à cppcheck, que je suis en cours d'exécution aussi dans le cadre de ma compilation?

Était-ce utile?

La solution

En fait, vous ne recevez pas d'avertissement à cause de la ( double parenthèse.

Essayez d'enlever une paire, et vous obtiendrez le dos d'avertissement.

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

Pour éviter de telles erreurs / fautes de frappe ennuyeux, je ne pas attribuer une valeur et de le tester dans la même déclaration. C'est trop erreur sujette IMHO.

Autres conseils

C'est une raison pour laquelle j'essaie de ne pas en faire trop dans une déclaration. Au lieu de

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

Pourquoi ne pas:

sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)
if(sockfd < 0) {
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top