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

时间:2010-06-17 09:12:06

标签: c++ c g++ cppcheck

我在调用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的“坏样式”,我也在编译中运行吗?

2 个答案:

答案 0 :(得分: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;
}

为了避免这种恼人的错误/拼写错误,我避免分配值并在同一语句中对其进行测试。这太容易出错了imho。

答案 1 :(得分: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) {