Pregunta

Me corrió a través del Socket operation on non-socket error en algunos de mi código de red al llamar connect y pasado mucho tiempo tratando de averiguar lo que estaba causando. Finalmente me di cuenta de que la siguiente línea de código estaba causando el problema:

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

Vea el problema? Esto es lo que la línea debe ser similar a:

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

Lo que no entiendo es por qué la primera línea, incorrecta no produce una advertencia. Para decirlo de otra manera, si no la forma general:

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

parecer extraño para el compilador, especialmente correr con g++ -Wall -Wextra?

Si no es así, no habría de hacerlo al menos mostrará como "mal estilo" a cppcheck, las cuales yo también estoy corriendo como parte de mi compilación?

¿Fue útil?

Solución

En realidad, usted no recibe ninguna advertencia debido a la ( doble paréntesis.

Trate de eliminar un par, y obtendrá la parte posterior de advertencia.

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

Para evitar este tipo de errores tipográficos / molestos, evito la asignación de un valor y para ello, en el mismo comunicado. Eso es demasiado propenso error en mi humilde opinión.

Otros consejos

Esa es una razón por la que trato de no hacer demasiado en un comunicado. En lugar de

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

¿Por qué no:

sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)
if(sockfd < 0) {
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top