你能省略main函数中的返回类型吗?

时间:2016-09-30 10:11:53

标签: c++

是否有一些关于main功能声明的特殊规则?

根据ideone,这是合法的C ++:

main()  // As opposed to int main()
{
   return 0;
}

另一方面,普通函数似乎没有权限避免返回类型:

f(){} 

int main()
{
    return 0;
}

给出错误:

  

prog.cpp:1:3:错误:ISO C ++禁止声明没有类型的'f'   [-fpermissive] f(){} ^

在这种情况下,main功能是否特殊?

6 个答案:

答案 0 :(得分:19)

永远不要忽略main的返回类型,因为它是非标准的!

wandbox example

  

prog.cc:1:6:警告:ISO C ++禁止声明'main'没有类型[-Wpedantic]    main()的

From $3.6.1

  

1程序应包含一个名为main的全局函数,它是程序的指定开始。它   是实现定义是否需要独立环境中的程序来定义主体   功能。 [注意:在独立环境中,启动和终止是实现定义的;启动   包含具有静态存储持续时间的命名空间作用域对象的构造函数的执行;   终止包含具有静态存储持续时间的对象的析构函数的执行。 - 结束说明]   §3.6.158

     

2实现不应预定义主函数。此功能不应过载。 它应该   返回类型为int ,但其类型为实现定义

答案 1 :(得分:11)

不,它有效,因为编译器支持真正的旧C,允许这样做。

答案 2 :(得分:7)

想法是错误的。

旧版本的C(pre-standard和1989标准)支持函数的隐式int返回类型。自1999年标准以来,它在C中是非法的。

没有C ++标准支持隐式int返回类型。实际上,隐式int在ARM中被“禁止”(Margaret Ellis和Bjarne Stroustrup的The Annotated C ++ Reference Manual)。 ARM是指导第一个C ++标准开发的关键文档之一。

答案 3 :(得分:1)

在C ++中,除了一些像Turbo C ++这样的旧C ++编译器之外,它是无效的。每个函数都应该用C ++指定返回类型。

参见参考链接:http://www.geeksforgeeks.org/implicit-return-type-int-c-language/

答案 4 :(得分:0)

对于旧C,它支持逻辑 - 当main()终止时它显式返回0表示程序成功。 main返回的int值通常是将传递回操作系统的值。

答案 5 :(得分:0)

标准规定了托管实现应如何处理“main”返回“int”的程序。当“main”返回时,它没有准确指定实现应该做什么,但它强烈暗示“main”返回零,实现应该对底层平台执行任何“正常”操作。它没有规定实现应如何处理“主要”返回其他内容的程序;在闲暇时,实现可以自由地行动。

允许独立式实现指定“main”必须永远不会返回,并且如果确实存在任意坏事可能会发生。标准没有规定任何特定的替代形式的调用,但暗示实现可能有用地支持这些形式。有些平台通过代码调用“void”函数,期望它返回“int”将导致奇怪和古怪的行为,无论函数是否实际返回,但有许多不会发生任何奇怪的事情。在一个独立的实现中,如果“main”返回会表现不好,但是如果函数永远不会返回函数的返回类型将无关紧要,将“main”声明为“void”函数可能是合理和合适的,因为它永远不会返回一个值。