C ++语法问题

时间:2011-07-06 03:58:20

标签: c++ coding-style

我正在开发基于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切换方法。

5 个答案:

答案 0 :(得分:2)

totalChunkAmount初始化之前将其设置为无效状态并检查该状态。例如,如果totalChunkAmountint,那么

totalChunkAmount = -1; // say -1 is invalid value
while(true)
{
 ...
 if(-1 == totalChunkAmount)
   totalChunkAmount = toRecv.ACK; // ACK can never be -1
}

同样,如果totalChunkAmount是指针,那么您可以将其设置为NULL0)。

[编辑注意:我只是想知道,在你的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 ::你可以很容易地编写你自己的类似的类。