返回 C 和 C++ 中的空隙类型

Return void type in C and C++

本文关键字:类型 C++ 返回      更新时间:2023-10-16

编译时没有任何警告。

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

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

void f(){
}
void f2(){
    return f();
}

更新

正如"拉德雷克萨斯"建议我尝试过这个:

$ 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 %sn", 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");
}

C11, 6.8.6.4 "The return statement":

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

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

来自同一文件的前言:

第二版的主要变化包括:

[...]

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

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


C++14, 6.6.3 "return声明":

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

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

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

从返回语句 @ cpp首选项

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


C11 规格草案 n1570 中的 OTOH:

第二版的主要变化包括:

返回

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

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

和 6.8.6.4 返回

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

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

C++允许这样的事情:

void f() 
{
    return void();
}

而 C 没有。这就是为什么如果您将其编译为 ISO C 而不是 ISO C++,则会发出警告。这被正式描述为:

表达式类型为 void 的 return 语句只能在 返回类型为 CV void 的函数

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

6.8.6.4 返回语句

约束

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

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

因此,在 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();

标准 C 不支持此构造:

C11 6.8.6.4: return语句

约束

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

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