返回 C 和 C++ 中的空隙类型
Return void type in C and C++
编译时没有任何警告。
这在 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 返回语句
约束
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和以前的版本认为这是违反约束的。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- 类中的字符串不命名类型