其他语句似乎被忽略
问题描述:
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语句未能评估为真,我期望else块被执行(appProtocol设置为APP_PROTO_RTP)。但是,这不会发生。相反,看起来else语句完全被忽略。我无法理解为什么会出现这种情况。其他语句似乎被忽略
正如您从我的gdb会话中看到的那样,if语句首次运行,并且appProtocol被设置为APP_PROTO_SIP(如预期的那样)。第二次通过时,如果失败,而不进入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)
答
你应该
appProtocol = APP_PROTO_RTP;
(无双等号)
else语句替换
appProtocol == APP_PROTO_RTP;
执行。但是您并未将值分配给appProtocol。
答
你不分配,你正在比较。使用=
,不==
答
你在这里使用的平等声明:
appProtocol == APP_PROTO_RTP;
,而不是分配。
正确的代码是:
appProtocol = APP_PROTO_RTP;
开启编译器警告应发出“声明没有效果”为你的语法错误警告。如果没有,请获得更好的编译器。从你的ubuntu头像判断,'g ++ -Wall'是你应该总是**使用的。 – msw 2010-08-28 15:41:47
@msw:的确如此。很明显,原始代码被封装到问题中(因为它应该),因为手动复制会隐藏这个错误(因为zobdos会不自觉地键入'=',而不是'==')。一个(正面)教科书的例子,说明为什么你总是应该填入代码。 – sbi 2010-08-28 16:06:05