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