返回无效的有效代码吗?

发布于 2024-09-12 12:44:01 字数 176 浏览 4 评论 0原文

我发现以下代码被 Visual C++ 2008 和 GCC 4.3 编译器接受:

void foo()
{

}

void bar()
{
  return foo();
}

我对它的编译感到有点惊讶。这是语言特性还是编译器中的错误? C/C++ 标准对此有何规定?

I found out that the following code gets accepted by Visual C++ 2008 and GCC 4.3 compilers:

void foo()
{

}

void bar()
{
  return foo();
}

I am a bit surprised that it compiles. Is this a language feature or is it a bug in the compilers? What do the C/C++ standards say about this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

找个人就嫁了吧 2024-09-19 12:44:02

这是 C++ 的语言功能

C++ (ISO 14882:2003) 6.6.3/3

具有“cv void”类型表达式的 return 语句只能在返回类型为 cv void 的函数中使用;表达式在函数返回调用者之前计算。

C (ISO 9899:1999) 6.8.6.4/1

带表达式的 return 语句不得出现在其返回类型的函数中
无效。

It's a language feature of C++

C++ (ISO 14882:2003) 6.6.3/3

A return statement with an expression of type “cv void” can be used only in functions with a return type of cv void; the expression is evaluated just before the function returns to its caller.

C (ISO 9899:1999) 6.8.6.4/1

A return statement with an expression shall not appear in a function whose return type
is void.

猫性小仙女 2024-09-19 12:44:02

是的,这是有效的代码。当您有模板函数时,这是必要的,以便您可以使用统一的代码。例如,

template<typename T, typename P>
T f(int x, P y)
{
  return g(x, y);
}

现在,当第二个参数是某种特定类型时,g 可能会被重载以返回 void。如果“returning void”无效,则对 f 的调用将会中断。

Yes, it is valid code. This is necessary when you have template functions so that you can use uniform code. For example,

template<typename T, typename P>
T f(int x, P y)
{
  return g(x, y);
}

Now, g might be overloaded to return void when the second argument is some particular type. If "returning void" were invalid, the call to f would then break.

疯到世界奔溃 2024-09-19 12:44:02

这是有效的,并且非常有用,例如,当您想在返回之前进行一些错误处理时,可以创建更清晰的代码:

void ErrRet(int code, char* msg)
{
   // code logging/handling error
}
void f()
{
   if (...) return ErrRet(5, "Error Message !");
   // code continue
}

This is valid and can be quite useful for example to create cleaner code in situations when you want to do some error handling before returning:

void ErrRet(int code, char* msg)
{
   // code logging/handling error
}
void f()
{
   if (...) return ErrRet(5, "Error Message !");
   // code continue
}
苍风燃霜 2024-09-19 12:44:02

确实有效。我经常将它用于输入验证宏:

#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());
  ...
}

Valid indeed. I use it often for input validation macros:

#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());
  ...
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文