是否在C+中逐步停止使用不带返回类型的main+;11? Stephen Prata在他的C++ C++Plus [P 31 ]的书中说:

是否在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

许多现有程序使用经典的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 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。