是否在C+中逐步停止使用不带返回类型的main+;11? Stephen Prata在他的C++ C++Plus [P 31 ]的书中说:
许多现有程序使用经典的C函数头:是否在C+中逐步停止使用不带返回类型的main+;11? Stephen Prata在他的C++ C++Plus [P 31 ]的书中说:,c++,c++11,C++,C++11,许多现有程序使用经典的C函数头: main()//原始C样式 在classic C下,省略返回类型 和函数是int类型一样,但是C++有 逐步淘汰这种用法 然而,C++11草案3.6.1->2说 实现不应预定义主要功能。此函数 不得超载。它应具有int类型的返回类型,但 否则,其类型是实现定义的 测试结果 $ g++ -Werror=pedantic MainCheck.cpp -o MainCheck MainCheck.cpp:3:6: error: ISO C++ forbids decl
main()//原始C样式
在classic C下,省略返回类型 和函数是int类型一样,但是C++有 逐步淘汰这种用法 然而,C++11草案3.6.1->2说 实现不应预定义主要功能。此函数 不得超载。它应具有int类型的返回类型,但 否则,其类型是实现定义的 测试结果
$ g++ -Werror=pedantic MainCheck.cpp -o MainCheck
MainCheck.cpp:3:6: error: ISO C++ forbids declaration of ‘main’ with no type [-Werror=pedantic]
main()
$ # also means g++ don't conform to the standard
证实了Prata先生在C++标准上所说的是真的。 C++11草案中是否有条款不鼓励使用:
main() // that is without return type.
是
其返回类型应为int型
本身就是这样一个子句?标准不要求
main
显式返回。若return
语句缺失,编译器只需将:
返回0代码>
最后。此规则不适用于其他函数
在C语言中,如果不是由程序员提供,则任何函数的默认返回类型都是int
,例如:
get() // int assumed
{
return 10;
}
C++标准要求必须指定返回类型。上面的代码将不会编译在C++编译器中。C90允许隐式int
,C99不允许隐式int
,这是工作草案对主要功能的说明。
摘录如下
实现不应预定义主要功能。此功能不应过载。它的类型应该有C++语言链接,它应该有一个类型为int的声明返回类型,否则它的类型就是实现定义。一项实施应允许两者兼而有之
- 函数()返回int和
- 返回int的函数(int,指向char的指针)
作为主体的类型
- :
main中的return语句具有离开main函数的效果[…],如果控件从main的复合语句末尾流出,则该效果相当于操作数为0的return
因此,标准规定,主要功能应具有以下类型之一:
int()
int(int,char**)
作为函数的主要函数,我猜它也遵循中的规则。
问题是这样的:我能从函数定义中省略返回类型吗?标准允许我这样做吗?
答案是否定的,确实。 < P>隐式<代码> int >代码>类型在所有C++标准中都是不允许的,即C++ 98中不允许使用。它在C++11中并不是什么新东西。在函数声明方面,main()
没有任何异常。此外,隐式int
规则不仅适用于main()
,而且适用于所有声明
< > C++中相关的条款是7 [DCL,DCL ]第11段:
只有在构造函数、析构函数和类型转换的函数声明中,decl说明符seq
省略
94)不再支持C的“隐式int”规则
我现在无法轻松访问C++98标准,但C++03肯定有相同的语句。唯一的区别是它在第7段中,脚注是“79”而不是“94”
C的隐式<代码> int 规则在第一个标准之前是C++的一部分,但在某个点被删除。编译器可以接受省略该类型的程序作为扩展,但我认为它们必须发出诊断。这是否意味着很多是一个单独的问题,因为在一行开头编写一个
\r
就可以满足这一要求,这一点早已确立
现在还有一个奇怪的例外,即程序执行可以从main()
末尾流出,而不需要return
语句:假定在main()
中强制执行return
语句会破坏现有代码
声明
其返回类型应为int
不说明函数如何获取其返回类型。它仅说明返回类型。另请参见
ISO/IEC 14882:1998包含:
§7声明
^7只有在构造函数、析构函数和类型转换的函数声明中,decl说明符seq
(省略)
脚注78说:
不再支持C的“隐式int”规则
C++11标准中的¨9和脚注89中也有相同的陈述
<> >,<代码>主()/<代码>没有返回类型,它从来没有成为标准C++的一部分,但它被允许在C++ 98标准创建之前(大概是因为向后兼容性的原因更长)。
如果你看看Stroustrup的“C++的设计和发展”(1994年出版),§2.8C声明语法说:
允许省略类型说明符(默认情况下,这意味着int
)也会导致复杂性…用户对该领域变化的负面反应非常强烈…我收回了零钱。我想我别无选择。允许隐含的<代码> int >代码>是C++语法中许多恼人的问题的根源。最后,十年后,C++ ANSI/ISO标准委员会决定不推荐隐含的<代码> INT/COM>。这意味着我们可能在十年左右的时间里摆脱它
通过C++ >代码>不允许它 >你是说标准不允许它。一些实现,比如说代码> G++< /COD>允许它……是的,C++标准需要给出显式类型。我认为C++不允许它足够清晰,没有一个是RE。