返回的无效代码是否有效? 我发现下面的代码被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 带有表达式的返回语句不应出现在返回类型为 它是空的返回的无效代码是否有效? 我发现下面的代码被Visual C++ 2008和GCC 4.3编译器所接受: void foo() { } void bar() { return foo(); },c++,c,C++,C,我有点惊讶它能编译。这是语言特性还是编译器中的错误?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 带有表达式的返回语句不应出现在返回类型为 它是空的 是的,它是有效代码。当您拥有模板函数以便可以使用统一代码时,这是必需的。比如说, template<t
是的,它是有效代码。当您拥有模板函数以便可以使用统一代码时,这是必需的。比如说,
template<typename T, typename P>
T f(int x, P y)
{
return g(x, y);
}
模板
tf(整数x,py)
{
返回g(x,y);
}
现在,当第二个参数是某个特定类型时,
g
可能会被重载以返回void。如果“returning 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());
...
}
T
不能为空,因为参数不能为空。谢谢,几分钟后我意识到我自己给出了一个糟糕的例子。固定的!此功能还打开了一个小陷阱:在void positive_action(int n){if(ncompiler也可以使用它作为提示,提示他们应该进行尾部调用优化,如果f()注意,经常编译C和C++的编译器将提供C++规则作为非标准扩展,同时编译C代码,不过如果你想移植,这不应该依赖。