我有下一个代码:
int main()
{
OwnSelect(23, FD_READ | FD_WRITE); // <---- Several arguments as one
return 0;
}
int OwnSelect(SOCKET s, long lNetworkEvents)
{
// How can i check that FD_READ has been passed?
if(lNetworkEvents == FD_READ)
{
// never here
}
return 0;
}
无论是否通过FD_READ传递了另一个FD,如何检查是否传递了FD_READ。谢谢!
发布于 2012-06-29 18:12:20
看起来你在这里错过了一些基本的比特操作。您正在对FD_READ和FD_WRITE进行OR运算(| =逐位OR),从而将这两个值指示的位设置为参数。要检查是否传递了FD_READ,需要使用FD_READ对lNetworkEvents进行AND操作,并检查结果是否等于FD_READ,如下所示:
`if (FD_READ == (lNetworkEvents & FD_READ)) { ... }`
当然,这是假设FD_READ和FD_WRITE是应该以这种方式使用的值(即通常没有重叠的位)。
编辑:修正,wabepper是绝对正确的:)哦!
发布于 2012-06-29 18:14:32
通过使用&
if ((lNetworkEvents & FD_READ) == FD_READ) {
...
}
发布于 2012-06-29 18:16:38
if ( (iNetworkEvents & FD_READ) != 0 )
就是你在这里要找的。只要有问题的“参数”是一个单比特(布尔值),这种方法就能很好地工作。对于更复杂的操作,比如fmtflags
中floatfield
上的操作,您需要与正确的值进行比较:
switch (myFlags & std::ios_base::floatfiled )
{
case std::ios:base::fixed:
// ...
// ...
}
最后,如果字段是整数值(例如3位的0...7
),则必须同时使用掩码和移位才能获得正确的值。(如果值是有符号的,则会更加复杂。)
https://stackoverflow.com/questions/11259846
复制相似问题