【发布时间】:2010-06-17 09:12:06
【问题描述】:
在调用connect 时,我在一些网络代码中遇到了错误Socket operation on non-socket,并花了很多时间试图找出导致它的原因。我终于发现是下面这行代码导致了这个问题:
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 显示为“坏样式”吗?我也在编译过程中运行它?
【问题讨论】:
-
几乎是我讨厌“赋值-条件”的原因...
-
我支持你,ereOn。我也讨厌“逗号运算符”——我曾经无意中在两个物理行的加法末尾有一个逗号,我花了一段时间才弄清楚为什么我得到了愚蠢的结果。如果有 #pragmas 或编译器选项来禁用此类 C 习语,这样我们就可以避免此类问题(并获得 OP 想要的错误/警告),那就太好了。
-
@JTeagle:当然,是的。实际上,OP没有收到警告的原因确实是缺乏运气。看我的回答。