你能在main函数中省略返回类型吗?
Can you omit the return type in main function?
对于main
函数的声明有什么特殊的规则吗?
根据ideone,这是合法的c++:
main() // As opposed to int main()
{
return 0;
}
另一方面,普通函数似乎没有特权避免返回类型:
f(){}
int main()
{
return 0;
}
给出错误:
prog.cpp:1:3: error: ISO c++禁止声明没有类型的'f'[-fpermissive] f(){} ^
在这种情况下main
函数是否特殊?
永远不要省略main
的返回类型,因为是非标准的!
wandbox示例:
掠夺。cc:1:6:警告:ISO c++禁止声明没有类型的'main' [-Wpedantic]main ()
从$ 3.6.1:
1程序应该包含一个名为main的全局函数,它是程序的指定起始点。它独立环境中的程序是否需要定义main函数。[注:在独立环境中,启动和终止是由实现定义的;启动包含具有静态存储持续时间的命名空间范围的对象的构造函数的执行;终止包含对具有静态存储持续时间的对象执行析构函数。-尾注]§3.6.1 58
2实现不应该预定义main函数。此函数不得重载。应当返回类型为int,但其类型为实现定义的
不,它可以工作,因为编译器支持非常旧的C语言,这允许。
ideone错了。
旧版本的C(预标准和1989标准)支持函数的隐式int
返回类型。自1999年标准以来,这在C语言是非法的。
int
返回类型。事实上,隐式的int
在ARM中被"禁止"(Margaret Ellis和Bjarne Stroustrup编写的注释c++参考手册)。ARM是指导第一个c++标准开发的关键文档之一。
在c++中,除了一些老的c++编译器(如Turbo c++)之外,它是无效的。每个函数都应该在c++中指定返回类型。
参见参考链接:http://www.geeksforgeeks.org/implicit-return-type-int-c-language/
对于旧的C,它背后有逻辑支持-当main()终止时,它显式返回0,意味着程序成功。main返回的int值通常是将要传递给操作系统的值。
标准规定了宿主实现应该如何处理"main"返回"int"的程序。它没有明确指定当"main"返回时实现应该做什么,但它强烈暗示,当"main"返回零时,实现应该做底层平台"正常"的事情。它没有规定实现应该如何处理"main"返回其他内容的程序;实现可以自由地选择有用或无用的行为。
独立实现允许指定"main"必须永远不返回,并且如果它返回可能会发生任意的坏事情。该标准没有规定任何特定的替代调用形式,但暗示实现可以有效地支持这些形式。在某些平台上,通过代码调用"void"函数,期望它返回"int",无论函数是否实际返回,都会导致奇怪的行为,但在许多平台上,没有任何奇怪的事情发生。在一个独立的实现中,如果"main"返回将会表现得很糟糕,但如果函数永远不会返回,函数的返回类型将是无关的,那么将"main"声明为"void"函数可能是合理和适当的,因为它永远不会返回值。
- 为什么返回类型中需要typename?C++
- 在模板化成员函数的返回类型中使用 std::enable_if 时的编译器差异
- 如果函数是在类的主体中定义的,我是否需要在成员函数的返回类型中指定 typename?
- 为什么在某些情况下从函数返回类型中删除 cv 限定符?
- 为什么函数返回类型中不允许参数推导?
- 为什么编译器不能从返回类型中推断出模板参数?
- 尾随返回类型中带有 SFINAE 的 GCC 错误
- 尾随返回类型中去 decltype 的原因
- 为什么在下面的代码返回类型中是用于运营商重载的类类型
- 为什么在.h中定义的私有结构需要.cpp文件中的返回类型中的范围
- 为什么 C++ 从推断的返回类型中去除引用限定符,为什么生存期延长不起作用?
- 函数返回类型中的模板类型推断
- 尾随返回类型中的占位符类型的用途是什么
- 访问lambda尾随返回类型中的概括捕获对象
- 返回对特定尺寸数组的引用,而无需明确说明返回类型中的大小
- 从函数返回类型中删除常量是否会中断 ABI
- T const & 在函数的返回类型中是什么意思?
- C++:如何在协变返回类型中重用代码
- 必须在类成员函数的返回类型中提供更具体的类型,但不能提供参数类型
- 返回类型中 && 和没有引用之间的区别