«Операция сокета на ошибке не сокета» из-за странного синтаксиса
Вопрос
Я пробежал по ошибке 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) {