【问题标题】:VS2005+WinSock: warning C4018: '<' : signed/unsigned mismatchVS2005+WinSock: 警告 C4018: '<' : 有符号/无符号不匹配
【发布时间】:2012-11-14 08:38:49
【问题描述】:

我无法从这段代码中删除warning C4018: '&lt;' : signed/unsigned mismatch

SOCKET s;
fd_set set;
FD_CLR(s,&set);

在我看来问题出在VS2005的FD_CLR的实现内部,实际上这不是什么大问题,只是很烦人。是否有此代码的可移植等效版本不会产生警告? (注意:我知道有一个#pragma 可以关闭警告。我也知道 FD_CLR 宏实际上可以完美运行。我只是在寻找一种编写代码而不发出警告的方法)

编辑:最终,我发现了发生了什么:第三方 .h 包含(错误!!!)将“u_int”重新定义为“int”。这就是为什么编译器抱怨 FD_CLR 中的 u_int 之间的比较。真丢人。

【问题讨论】:

  • 我看到的唯一可能是将s 转换为int (FD_CLR( (int)s, &amp;set );) 看看是否有任何改变。其他一切都会在FD_CLR 内部四处游荡,或违反其声明(即治愈比疾病更糟)。再三考虑,您可以为 FD_CLR 编写一个包装器,在本地禁用该特定警告。
  • 该代码看起来不错,我从未收到过关于在旧版本或新版本 VS 中使用 FD_CLR 宏的警告。你确定这是错误所在的行吗?
  • @DevSolar 更改“s”的类型并不能解决问题。不幸的是,问题出在宏内部。但是为 FD_CLR 编写一个包装器是一个干净的解决方案,如果你将它作为真实答案发布,你会得到奖励。
  • @Joachim Pileborg 是的,还使用树线测试程序进行了测试。这可能取决于 VS2005 SP 级别(我的是 2.0.50727 SP2)。

标签: c visual-studio-2005 winsock


【解决方案1】:

与其在每次调用 FD_CLR() 时全局或本地禁用警告,不如为该调用编写一个包装器,为您在本地禁用该特定警告。

【讨论】:

    【解决方案2】:

    也许您可以重写宏 FD_CLR 并修改循环变量的 int/uint,但这会导致宏重新定义警告。我认为#pragma 更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多