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

时间:2016-03-14 12:24:02

标签: c++ c gcc clang language-lawyer

编译时没有任何警告。

这在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");
}

5 个答案:

答案 0 :(得分:71)

C11 ,6.8.6.4“return声明”:

  

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

,您可能不会使用表达式,即使它是void类型。

从同一文件的前言:

  

第二版的主要变化包括:

     

[...]

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

所以这是对C89的改变 - > C99(语言标准的第二版),从那时起就一直如此。

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

  

表达式为非void类型的return语句只能用于返回值的函数[...]   表达式为void的return语句只能在返回类型为cv的函数中使用   无效;在函数返回其调用者之前计算表达式。

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

答案 1 :(得分:14)

此代码在C++中允许,但在C

中不允许

来自Return statement @ cppreference

  

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

OTO在C11规范草案n1570:

第二版的主要变化包括:

  

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

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

和6.8.6.4返回

  

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

(即使表达式评估为void

答案 2 :(得分:5)

C ++允许这样的东西:

void f() 
{
    return void();
}

虽然C没有。这就是为什么在编译ISO C而不是ISO C ++时发出警告的原因。这被正式描述为:

  

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

答案 3 :(得分:3)

ISO / IEC 9899:201x委员会草案说明如下:

  

6.8.6.4返回声明

     

约束

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

         

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

  2.   

因此,在C中禁止使用。

您需要使用-pedantic切换到gcc,以便投诉标准违规行为:

test.c: In function ‘f2’:
test.c:6:12: warning: ISO C forbids ‘return’ with expression, in function returning void 
            [-Wpedantic]
     return f();

答案 4 :(得分:1)

标准C不支持这种结构:

  

C11 6.8.6.4:return声明

     

约束

     

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

对于问题中的特殊情况,没有添加任何特殊规定。一些C编译器确实支持这作为扩展(gcc,除非指示符合C标准之一),但C11和以前的版本认为它是违反约束。