我发现以下代码被 Visual C++ 2008 和 GCC 4.3 编译器接受:
void foo()
{
}
void bar()
{
return foo();
}
我对它能编译感到有点惊讶。这是语言特性还是编译器中的错误? C/C++ 标准对此有何规定?
这是C++的语言特性
C++ (ISO 14882:2003) 6.6.3/3
具有“cv void”类型表达式的 return 语句只能在返回类型为 cv void 的函数中使用;表达式在函数返回调用者之前计算。
C (ISO 9899:1999) 6.8.6.4/1
带表达式的 return 语句不得出现在其返回类型的函数中 无效。
是的,这是有效的代码。当您有模板函数时,这是必要的,以便您可以使用统一的代码。例如,
template<typename T, typename P>
T f(int x, P y)
{
return g(x, y);
}
现在,当第二个参数是某种特定类型时,
g
可能会被重载以返回void。如果“返回 void”无效,则对 f
的调用将会中断。
这是有效的,并且非常有用,例如,当您想在返回之前进行一些错误处理时,可以创建更清晰的代码:
void ErrRet(int code, char* msg)
{
// code logging/handling error
}
void f()
{
if (...) return ErrRet(5, "Error Message !");
// code continue
}
确实有效。我经常将它用于输入验证宏:
#define ASSERT_AND_RETURN_IF_NULL(p,r) if (!p) { assert(p && "#p must not be null"); return r; }
bool func1(void* p) {
ASSERT_AND_RETURN_IF_NULL(p, false);
...
}
void func2(void* p) {
ASSERT_AND_RETURN_IF_NULL(p, void());
...
}