我正在开发基于UDP的文件共享程序。在解释问题之前,让我发布一些示例代码。
while (true)
{
Data toRecv;
int bytesRead = recvfrom(s->_UPDsock, (char*)&toRecv, sizeof(toRecv), 0,(SOCKADDR*)&remoteAddress, &remoteAddresslength);
if(bytesRead > 0)
{
string temp(toRecv.chunk,(bytesRead-sizeof(int)));
if(!checker)
{
//total packet amount.
totalChunkAmount = toRecv.ACK;
checker = true;
}
}
}
正如你在第13行看到的那样,我正在使用我从UDP的totalChunkAmount
函数获得的变量来初始化recvFrom
。我需要仅在ONCE初始化该值,这就是我在bool
if()
检查中使用它的原因。在初始化之后,我将bool
值翻转为true
,因此不会再次初始化。有没有其他方法可以实现相同的结果,但没有使用丑陋的bool
切换方法。
答案 0 :(得分:2)
在totalChunkAmount
初始化之前将其设置为无效状态并检查该状态。例如,如果totalChunkAmount
是int
,那么
totalChunkAmount = -1; // say -1 is invalid value
while(true)
{
...
if(-1 == totalChunkAmount)
totalChunkAmount = toRecv.ACK; // ACK can never be -1
}
同样,如果totalChunkAmount
是指针,那么您可以将其设置为NULL
(0
)。
[编辑注意:我只是想知道,在你的while
循环中,你主要是在初始化变量,那么为什么你的break
之后不会出现循环?如果你能这样做,它会更清洁,不需要这样的检查。]
答案 1 :(得分:1)
totalChunkAmount = totalChunkAmount == [uninitialized_value_here] ? toRecv.ACK : totalChunkAmount;
答案 2 :(得分:0)
我唯一可以想到的就是将totalChunkAmount初始化为-1(或其他一些非真实世界值),然后检查(避免额外的bool声明)。
答案 3 :(得分:0)
您提出的代码可能更长,但肯定更具可读性并且更容易遵循逻辑,我会保持原样。
我要做的唯一改变是将无面bool checker
重命名为bool totalChunkAmountInitialized
。
答案 4 :(得分:0)
优雅的解决方案是使用boost :: optional<&gt ;.它非常适合这种情况并且非常轻巧。如果你不能或不想使用boost ::你可以很容易地编写你自己的类似的类。