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