4

我在调用时遇到了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 的“坏风格”,我也在编译过程中运行它吗?

4

2 回答 2

5

实际上,由于双括号,您不会收到任何警告(

尝试删除一对,您会收到警告。

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

为了避免这种烦人的错误/错别字,我避免在同一个语句中分配一个值并对其进行测试。恕我直言,这太容易出错了。

于 2010-06-17T09:18:14.160 回答
2

这就是为什么我尽量不在一份声明中做太多的原因之一。代替

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) {
于 2010-06-17T09:19:11.413 回答