返回的无效代码是否有效? 我发现下面的代码被Visual C++ 2008和GCC 4.3编译器所接受: void foo() { } void bar() { return foo(); }

返回的无效代码是否有效? 我发现下面的代码被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

我有点惊讶它能编译。这是语言特性还是编译器中的错误?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<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代码,不过如果你想移植,这不应该依赖。