首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >由于奇怪的语法导致“非套接字上的套接字操作”错误

由于奇怪的语法导致“非套接字上的套接字操作”错误
EN

Stack Overflow用户
提问于 2010-06-17 17:12:06
回答 2查看 351关注 0票数 4

在调用connect时,我在我的一些网络代码中遇到了错误Socket operation on non-socket,并花费了大量时间试图找出导致它的原因。我最终发现是下面这行代码导致了这个问题:

代码语言:javascript
运行
复制
if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol) < 0)) {

看到问题了吗?这条线应该是这样的:

代码语言:javascript
运行
复制
if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {

我不明白的是,为什么第一行错误的代码不会产生警告。换句话说,一般的形式不应该是:

代码语言:javascript
运行
复制
if ( foo = bar() < baz ) do_something();

编译器看起来很奇怪,尤其是在g++ -Wall -Wextra上运行?

如果不是,它至少应该在cppcheck中显示为“糟糕的样式”,我也将其作为编译的一部分运行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-17 17:18:14

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

尝试删除一个对,您将得到警告。

代码语言:javascript
运行
复制
#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;
}

为了避免这种恼人的错误/打字错误,我避免在同一个语句中赋值和测试它。这是太多容易出错的错误了。

票数 5
EN

Stack Overflow用户

发布于 2010-06-17 17:19:11

这就是为什么我尽量不在一条语句中做太多事情的原因之一。而不是

代码语言:javascript
运行
复制
if ((sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)) < 0) {

为什么不呢:

代码语言:javascript
运行
复制
sockfd = socket( ai->ai_family, ai->ai_socktype, ai->ai_protocol)
if(sockfd < 0) {
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3060295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档