在C和C++中返回void类型

Nic*_*ick 65 c c++ gcc clang language-lawyer

这编译没有任何警告.

这在C和C++中是合法的还是只在gcc和clang中工作?

如果它是合法的,那么在C99之后它是新东西吗?

void f(){

}

void f2(){
    return f();
}
Run Code Online (Sandbox Code Playgroud)

更新

正如"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();
Run Code Online (Sandbox Code Playgroud)
$ 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.
Run Code Online (Sandbox Code Playgroud)
$ gcc -Wall -Wpedantic -c x.cc
(no errors)
Run Code Online (Sandbox Code Playgroud)
$ clang -Wall -Wpedantic -c x.cc
(no errors)
Run Code Online (Sandbox Code Playgroud)

更新

有人问这个建筑是如何帮助的.好吧或多或少的语法糖.这是一个很好的例子:

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");
}
Run Code Online (Sandbox Code Playgroud)

Dev*_*lar 71

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以来一直有效).

  • @Lundin:在C++中,主要用于模板.如果`f`和`f2`的返回类型是模板的参数,那么能够编写`return f();`而不必使用特殊情况`void`是很方便的.(显然这个*特定的*示例代码并不真正作为模板工作 - 但是对于更复杂的代码它可能很有用 - 例如,请参阅`期货'的内容. (8认同)
  • @Lundin:模板?我假设.看起来像<= C99也允许它,而C++可能只是复制了这种行为. (7认同)
  • 正如Mohit的答案正确引用的那样,项目"在没有表达的情况下返回不返回值的函数"是在前面的第7段"**第二版**版本中的重大变化"而不是第6段"第3版... [m ]主要变化".第二版是C99,它改变了C89/90只返回*没有*表达; 自从C89/90起,当void首次引入时,禁止在void函数中返回*with*表达式.在C99之前的@Lundin返回没有表达式的**非** - void函数*并且调用者试图使用值*是UB. (3认同)
  • 特别是,在同步执行函数的情况下,成员将只返回external_function(args ...); (2认同)

Moh*_*ain 15

允许使用此代码,C++但不允许使用此代码C

来自Return语句@cppreference

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


OTO在C11规格草案n1570中:

第二版的主要变化包括:

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

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

和6.8.6.4返回

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

(即使表达式评估为void)


edm*_*dmz 5

C++允许这样的东西:

void f() 
{
    return void();
}
Run Code Online (Sandbox Code Playgroud)

虽然C没有.这就是为什么如果你编译ISO C而不是ISO C++就会发出警告.这被正式描述为:

表达式为void的return语句只能在返回类型为cv void的函数中使用