其他声明似乎被忽略了

时间:2010-08-28 15:30:08

标签: c++ if-statement

void PacketRecord::determineAppProtocol()
{
    if (ipProtocol == IP_PROTO_UDP)
    {
        std::istringstream ss(udpData);

        std::string line;
        if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos))
        {
            appProtocol = APP_PROTO_SIP;
        }
        else
        {
            appProtocol == APP_PROTO_RTP;
        }
    }
    else
    {
        appProtocol = APP_PROTO_UNKNOWN;
    }
}

如果内部if语句无法计算为true,我希望执行else块(appProtocol设置为APP_PROTO_RTP)。但是,这不会发生。相反,似乎else语句完全被忽略了。我无法理解为什么会这样。

从我的gdb会话中可以看到,if语句第一次工作,appProtocol设置为APP_PROTO_SIP(如预期的那样)。第二次,if失败但不是进入else并将appProtocol设置为APP_PROTO_RTP,它完全退出函数而不设置appProtocol。 appProtocol保持设置为APP_PROTO_INVALID(它在PacketRecord ctor中初始化的值)。

Breakpoint 1, PacketRecord::determineAppProtocol (this=0x805c6c8) at PacketRecord.cpp:156
156     if (ipProtocol == IP_PROTO_UDP)
(gdb) step
158         std::istringstream ss(udpData);
(gdb) 
159         std::string line;
(gdb) 
160         if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos))
(gdb) 
162             appProtocol = APP_PROTO_SIP;
(gdb) 
167         }
(gdb) 
173 }
(gdb) continue 
Continuing.

Breakpoint 1, PacketRecord::determineAppProtocol (this=0x8065388) at PacketRecord.cpp:156
156     if (ipProtocol == IP_PROTO_UDP)
(gdb) step
158         std::istringstream ss(udpData);
(gdb) 
159         std::string line;
(gdb) 
160         if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos))
(gdb) 
167         }
(gdb) 
173 }
(gdb) 

3 个答案:

答案 0 :(得分:19)

你应该替换

appProtocol == APP_PROTO_RTP;

通过

appProtocol = APP_PROTO_RTP;

(没有双等号)

执行else语句。但是你没有将值赋给appProtocol。

答案 1 :(得分:5)

你没有分配,你在比较。使用=,而不是==

答案 2 :(得分:3)

你在这里使用了一个相等的陈述:

 appProtocol == APP_PROTO_RTP;

而不是分配。

正确的代码是:

appProtocol = APP_PROTO_RTP;