代码之家  ›  专栏  ›  技术社区  ›  Robert S. Barnes Antoni

“非套接字上的套接字操作”错误,原因是语法奇怪

  •  4
  • Robert S. Barnes Antoni  · 技术社区  · 14 年前

    我偶然发现了这个错误 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 ?

    2 回复  |  直到 14 年前
        1
  •  5
  •   ereOn    14 年前

    实际上,你没有得到任何警告,因为双括号 ( .

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

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

        2
  •  2
  •   zildjohn01    14 年前

    这就是为什么我在一次陈述中尽量不做太多的原因之一。而不是

    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) {