经过近一个小时的调试,我终于在一个return语句后发现了缺少的分号。这是简化版
void PrintNumber(int value) {
cout << value << endl;
}
void BuggyFunction(int value)
{
if (value == 0)
return
PrintNumber(value);
}
是的,PrintNumber永远不会被调用。但编译器(VS 2015)是沉默的。这种行为有原因吗?
答案 0 :(得分:4)
嗯,从技术上讲,你的功能(由于缺少分号)解释如下:
void BuggyFunction(int value) {
if (value == 0) {
return PrintNumber(value);
}
}
由于PrintNumber
也有void
作为返回类型,因此这句话在句法上是完全合法的,尽管它显然没有多大意义。
请注意,C ++编译器并不关心缩进。如果要正确定义语句和变量,请使用大括号(就像我在上面的代码片段中所做的那样)以避免混淆。
答案 1 :(得分:2)
您的代码相当于:
void BuggyFunction(int value)
{
if (value == 0)
{
return PrintNumber(value);
}
}
由于PrintNumber的返回类型为void,因此不会生成与可疑隐式类型转换相关的任何编译器警告。
如果你的编译器生成了一个&#34;无法访问的代码&#34;警告,这是错误的,因为你写的所有代码都是可以访问的。