【发布时间】:2010-08-28 15:30:07
【问题描述】:
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)
【问题讨论】:
-
打开编译器警告应该为您的语法错误发出“语句无效”警告。如果没有,请获得更好的编译器。从您的 ubuntu 头像来看,
g++ -Wall是您应该始终使用的。 -
@msw:确实。显然,原始代码已粘贴到问题中(应该如此),因为手动复制会隐藏此错误(因为 zobdos 会无意识地输入
=,而不是==)。一个(正面)教科书示例,说明为什么您应该始终粘贴代码。
标签: c++ if-statement