C++中void函数内return调用另一void函数是否符合C++11规范?
核心结论
return bar(); 这种写法在C++11及之后的所有正式标准中都是完全合法的语法,和C语言的规则存在本质差异。
和C语言规则的核心区别
C语言严格要求,返回值类型为void的函数中,return语句内不允许出现任何表达式,哪怕表达式本身是void类型也不行。你给出的示例代码如果放到标准C环境下,编译器会直接抛出语法错误。
但C从C11标准开始,就明确放宽了这条限制,专门允许void返回类型的函数中,在return后面直接接另一个void类型函数的调用表达式。
C++11的标准依据
根据C++11标准对return语句的定义:
对于返回值类型为
void的函数,return语句不要求携带返回值表达式;但如果携带了表达式,该表达式的类型必须严格为void。
也就是说,只要return后面跟的表达式本身是void类型(比如一个返回void的函数调用),整个语句就完全符合语法要求,编译器不会报任何错误。
写法的实际等价性
你偏好的return bar();写法,和“先单独执行bar();、再写裸return;”的书写风格在运行行为上完全等价:
- 程序会先执行
bar()的全部逻辑,完成输出等预设操作 bar()执行完成返回后,当前foo函数立刻进入返回流程,不会执行函数内后续的多余代码- 不会产生任何额外的运行时开销,也不会改变程序的原有逻辑
规则的延续性
这条从C11确立的语法规则,直到最新的C23正式标准、以及正在制定的后续标准草案中,都没有被修改或移除,始终是合法的常用语法。
注意事项
- 这种写法仅当
return后面跟的表达式是void类型时才合法。如果在返回void的函数里写return 123;或者return someIntFunc();这类携带非void类型表达式的语句,依然会触发语法错误。 - 从代码可读性的角度,这种写法非常适合需要提前终止函数、同时调用收尾/清理逻辑的场景,逻辑直白,不会增加额外的阅读负担。
内容的提问来源于stack exchange,提问作者jeffbRTC
相关产品推荐
相关产品推荐

