«Операция сокета на ошибке не сокета» из-за странного синтаксиса

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

Чтобы избежать таких раздражающих ошибок / опечаток, я избегаю назначения ценности и тестирования его в том же утверждении. Это слишком много ошибок, склонный к ИМХО.

Другие советы

Вот почему я стараюсь не делать слишком много в одном утверждении. Вместо

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