在 C 和 C 中返回 void 类型

新手上路,请多包涵

这编译没有任何警告。

这在 C 和 C++ 中是否合法,还是仅在 gcc 和 clang 中有效?

如果是合法的,是不是C99之后的新东西?

 void f(){

}

void f2(){
    return f();
}

更新

正如“Rad Lexus”所建议的那样,我尝试了这个:

 $ gcc -Wall -Wpedantic -c x.c
x.c: In function ‘f2’:
x.c:7:9: warning: ISO C forbids ‘return’ with expression, in function returning void [-Wpedantic]
  return f();


 $ clang -Wall -Wpedantic -c x.c
x.c:7:2: warning: void function 'f2' should not return void expression [-Wpedantic]
        return f();
        ^      ~~~~~
1 warning generated.


 $ gcc -Wall -Wpedantic -c x.cc
(no errors)


 $ clang -Wall -Wpedantic -c x.cc
(no errors)

更新

有人问这个建筑有什么帮助。好吧,或多或少是语法糖。这是一个很好的例子:

 void error_report(const char *s){
    printf("Error %s\n", s);
    exit(0);
}

void process(){
   if (step1() == 0)
      return error_report("Step 1");

   switch(step2()){
   case 0: return error_report("Step 2 - No Memory");
   case 1: return error_report("Step 2 - Internal Error");
   }

   printf("Processing Done!\n");
}

原文由 Nick 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 606
2 个回答

C11 , 6.8.6.4 “ return 声明”:

带有表达式的 return 语句不应出现在返回类型为 void 的函数中。

,你不能使用表达式,即使它是 void 类型。

来自同一文件的前言:

第二版的主要变化包括:

[…]

  • return 在返回值的函数中不允许没有表达式(反之亦然)

所以这是从 C89 -> C99(语言标准的第二版)的变化,从那以后一直如此。


C++14 , 6.6.3 “ return 声明”:

带有非 void 类型表达式的 return 语句只能在返回值的函数中使用 […] 带有 void 类型表达式的 return 语句只能在返回类型为 cv void 的函数中使用;表达式在函数返回其调用者之前被评估。

的, 如果 表达式是 void 类型(自 C++98 以来一直有效),您可以使用表达式。

原文由 DevSolar 发布,翻译遵循 CC BY-SA 3.0 许可协议

此代码允许在 C++ 但不允许在 C

来自 Return 语句@cppreference

在返回 void 的函数中,如果表达式类型为 void,则可以使用带有表达式的 return 语句。


C11 规范草案 n1570 中的 OTOH:

第二版的主要变化包括:

在返回值的函数中不允许不使用表达式返回(反之亦然)

return 在返回 void 的函数中不允许使用表达式

和 6.8.6.4 返回

带有表达式的 return 语句不应出现在返回类型为 void 的函数中。没有表达式的 return 语句只能出现在返回类型为 void 的函数中。

(即使表达式的计算结果为 void

原文由 Mohit Jain 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题