【问题标题】:In a non-void function I want to return nothing在非 void 函数中,我什么都不想要返回
【发布时间】:2021-02-07 12:40:18
【问题描述】:

我有一个返回指针的函数。在这个函数中,我想检查一个条件。如果满足这个条件,我想返回指针。但是,如果不满足条件,我想打印错误日志并且不返回任何内容。在这种情况下我该怎么办?如果条件不满足,我不会返回任何东西,但我会收到警告。谢谢

【问题讨论】:

  • 在非 void 函数中,您必须返回 something。通常nullptr 表示错误。
  • C 还是 C++?选择一个
  • 可以返回一个optional指针,但你仍然会返回something。此外,nullptr 已经包含相同的信息。
  • @EfeBerkay “我可以在另一个中找到相关答案。” 我严重怀疑,c 和 c++ 是非常不同的语言。
  • 如果我们告诉您“抛出异常”,您如何找到 C 答案?

标签: c++ pointers error-handling return


【解决方案1】:

但是,如果不满足条件,我想打印错误日志并且不返回任何内容。

好吧,除非您想退出程序或抛出异常或类似的东西,否则这是不可能的。当你有一个返回指针的函数时,最常见的解决方法是返回一个空指针。

“解决”它的一种非常糟糕的方法就是跳过 return 语句,如下所示:

int *foo() {
    if(<condition>)
        return <some pointer>
    log(<message>);
    // Simply skip the return statement here
}

我强烈反对它,因为它是未定义的行为。因为它只需要一行来避免这种情况,所以只需在最后添加一个return nullptr。请注意,由于到达最终的} 是UB,编译器可能会将上述函数优化为:

int *foo() {
    return <some pointer>
}

是的,它跳过了日志消息和条件。原因是编译器可能会假设 UB 永远不会发生。

此外,“不返回任何内容”也没有任何意义。考虑这段代码:

int *foo() {
    // Code
}

int main() {
    int *ptr;
    ptr = foo();
    printf("%p\n", ptr); // What should the output here be?

“不返回任何内容”没有多大意义,因为必须为 ptr 分配一些值。我能想到的合理解决方案只有两种:

  1. ptr 不会被修改
  2. ptr 获得“无”值

1 是不可能的,因为 C++ 根本不支持。一种解决方法是这样的,但它需要将指针传递给函数:

int *foo(int *ptr) {
    if(<condition>)
        return <some pointer>
    return ptr;
}

2 是不可能的。 C++ 没有“无”值。你能得到的最接近的只是一个空指针。对于浮点数,您可以改用 NaN 数。但是没有适用于所有类型的通用“无”。

【讨论】:

  • 如果语句没有被处理,这可能会导致一些错误,因此您需要在函数末尾添加另一个 return &lt;some pointer&gt;,即使这只是 return nullptr 不返回非void 函数并不总是一个好主意~
  • 如果您只是跳过 return 语句,而是尝试记录错误,编译器可以说,“哦,这个 log 语句永远无法执行,因为如果它执行了,我们会遇到未定义的行为。让我为你删除那个日志语句”
  • @gamercodeman 和贾斯汀:这还不够清楚吗?我的意思是,我说它“非常糟糕”,我提到它是 UB。
猜你喜欢
  • 2016-04-10
  • 2016-11-26
  • 2012-07-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 2017-10-10
  • 2018-03-04
  • 1970-01-01
相关资源
最近更新 更多