C++中EDOCX1 0函数的正确签名是什么?正确的返回类型是什么,从main返回值意味着什么?允许的参数类型是什么?它们的含义是什么?
这个系统是特定的吗?这些规则随时间变化了吗?如果我违反了它们会发生什么?
- 这与C和C++中EDCOX1和0返回的内容密切相关或重复。
- @乔纳森莱弗勒不是开玩笑…大约8个月前,它被添加到第6版的副本列表中。
在main函数必须declared作为一种非成员函数在全局命名空间。这意味这它不能是一个静态的或非静态成员函数的类,也可以placed它是在一个命名空间(夏娃的unnamed命名空间)。 </P >
的名称是不main保留在C + +除了作为一个函数的全局命名空间。你是自由的declare名main其他实体,包括在其他的事情,类,变量,enumerations,成员函数和非成员函数不在全局命名空间。 </P >
你可以declare的函数名main作为一个成员函数或命名空间中的一种,但这样的函数,会不会是"maindesignates函数,在程序的开始。 </P >
在main函数不能被declared AS static或inline。。。。。。。它也不能被负载;有可以只有一个函数名main在全局命名空间。 </P >
在main函数不能被用在你的程序:你是不允许打电话的main函数从anywhere在你的代码,或是你允许带到它的地址。 </P >
在返回类型main必须int。。。。。。。好的其他收益型是允许的(这个规则是在大胆的,因为它是非常普通的程序incorrect看到那declare main回报与A型void;这是最probably在竞相violated规则关于mainfunction)。 </P >
这是两部的声明说,main必须允许的: </P >
1 2
| int main() // (1)
int main(int, char*[]) // (2) |
(1),这是好的参数。 </P >
(2),这是两个参数,和他们是conventionally名argc和argv,分别为。argv是一个指针的数组C字符串的representing的arguments的程序。argc是数arguments在argv阵列。 </P >
通常,argv[0]包含的名称的程序,但这是不总是对的情况。argv[argc]是guaranteed OP是一个空指针。 </P >
值得注意的是,自安阵列型argument(状char*[])是真的只是一分型argument在disguise,下面的两种方法都是有效的写(2)和他们的两exactly均同样的事: </P >
1 2
| int main(int argc, char* argv[])
int main(int argc, char** argv) |
一些implementations可能允许其他类型的参数化和数字;你会要检查的文件执行,你看到它是什么支持。 </P >
main()是预期返回的成功表明零和非零的表明的故障。你是不需要的explicitly写一returnstatement在main():如果你让main()回报不安return显式声明,它的作为,如果你有一return 0;书写。下面的两main()函数有同样的行为: </P >
1 2
| int main() { }
int main() { return 0; } |
这是两个宏,EXIT_SUCCESS和EXIT_FAILURE,定义在,也可以是returned从main()表明对成功和失败的,分别为。 </P >
该值由returned main()是通过对exit()函数,这terminates的程序。 </P >
值得注意的是所有的这applies当编写一个只读型环境(informally,安在你的环境中有一个全标准库和有一页操作系统运行你的程序。它也可能是编译到一个C + +程序的显示环境(例如,某些类型的嵌入式系统),在这一实例的启动和终止是wholly实现定义的函数和一个main()夏娃的要求是不可能的。如果你是写作的C + +的desktop现代操作系统,不过,y-o-u-r-e编写A型环境。 </P >
- IIRC唯一保证的返回值是0、exit_success(与0效果相同)和exit_failure。编辑:啊,可以返回其他非零状态值,但有实现定义的含义。只有退出失败才能保证在某种程度上被解释为失败值。
- 指定(只需确定)这是引用C++的话就不会有什么坏处。爪哇/ C用户可能会混淆,因为这些语言实际上要求入口点反直观地在一个类中(由于某种原因)。另外,旧的void main格式不是C的保留吗?
- SyNeNeTe:这个问题在第一句中问到:"C++中主要函数的正确签名是什么?"这个问题被标记为[C++]和[C++-FAQ]。如果Java或C用户(或其他任何人)仍然困惑,我无法帮助它。c要求Main是静态成员函数,因为它甚至没有非成员函数。甚至C89也要求Main返回int。我对K&R C不太熟悉,不知道它的确切规则,但我想它也需要Main返回int,因为没有返回类型的Main在K&R中有点常见,没有类型=隐式int。
- @詹姆斯·麦克内利斯,你能解释一下埃多克斯吗?
- @苏海尔:因为语言标准规定返回类型应该是int。
- @詹姆斯·麦克内利斯,如果我使用void有什么害处吗?
- @苏海尔:是的。您的代码将是不正确的C++,许多编译器会拒绝您的代码。
- @詹姆斯·麦克内利斯哦!谢谢您!你能说出一些拒绝void返回类型的编译器吗?到目前为止,我只使用Visual studio c++(还有古老的turbo-c++),它通过了我的代码。
- @james mcnellis微软的编译器如何通过void返回类型为Main的代码。(微软Visual C++ 2010快速版)
- SuHaul:VisualC++允许EDCOX1×10返回类型作为语言扩展。不允许的编译器包括gcc和comeau。
- @詹姆斯·麦克内尔,谢谢你!
- int main()版本是否始终是标准的一部分,还是最近添加的内容?
- 它被添加到C超过五十年前,早在有C++标准。
- 在不太常见的平台(如VAX/VMS)上,编译器遵循当时比较模糊的C标准的旧版本,EXIT_SUCCESS和EXIT_FAILURE仅作为exit()的参数可靠。从main()返回其中任何一个都可能产生意想不到的效果。既然标准已经澄清,那么就没有标准的、可移植的方法来向主机环境返回完全任意的值;您必须使用特定于主机的扩展。
从标准docs.,3.6.1.2 main函数, </P >
It shall have a return
type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following
definitions of main:
int main() { / ... / }和 int main(int argc, char* argv[]) { / ... / } </P >
In the latter form argc shall be the number of arguments passed to the program from the environment in which the
program is run.If argc is nonzero these arguments shall be supplied in argv[0] through argv[argc-1] as pointers to
the initial characters of null-terminated multibyte strings.....
希望这helps………………… </P >
- 对于Main的返回类型应该是int有什么具体的原因吗?
- @suhailgupta:这样调用进程就知道这个进程是否应该被认为是成功的。允许void打破了这个模型。如果你拥有它意味着"总是认为成功"的话,它甚至没有真正意义。因为你不知道这个过程是否真的失败了,所以你真的成功了吗?不,返回int。
最新公布的标准(C++ 14)的确切措辞是:
An implementation shall allow both
as the type of main.
这就清楚地表明,只要main的类型是int()或int(int, char**)的类型,就允许使用其他拼写。因此,还允许以下内容:
- int main(void)
- auto main() -> int
- int main ( )
- signed int main()
- typedef char **a; typedef int b, e; e main(b d, a c)
- 铌。我把这个答案放在另一个线程的注释中,有人试图引用这个线程作为证据,在C++中EDCOX1〔2〕是不正确的。
- @Stargateur auto main() -> int没有推断的返回类型。注意in"(auto main()…"不允许)"并且请学习知道什么时候你还不知道什么时候添加有意义的东西。
有效期是两mains int main()和int main(int, char*[])。。。。。。。其他的任何东西可能或不可能的编译。如果不mainT A explicitly返回值是0,implicitly returned。。。。。。。 </P >
- 当我提到Main的返回类型为void时,我从未见过没有编译的代码。main的返回类型应该是int有什么具体原因吗?
- 语言规范说main必须有int的返回类型。编译器允许的任何其他返回类型都是编译器特定的增强。基本上使用空格意味着你在用类似但不C++的语言编程。
- 该标准要求int作为Main的返回类型的原因是该值作为程序的退出代码传递给shell,而sh要求int。
- 也许原因是纪律?可以有多条路径。如果返回类型为void,则它们都是静默的。对于int,我们必须为来自Main的每个返回定义特定的退出值。
细节是返回值和它们的意义 </P >
3.6.1每([basic.start.main]): </P >
A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling std::exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing
的行为是在详细的std::exit型(18.5 [support.start.term]),和describes的状态代码: </P >
Finally, control is returned to the host environment. If status is zero or EXIT_SUCCESS, an implementation-defined form of the status successful termination is returned. If status is EXIT_FAILURE, an implementation-defined form of the status unsuccessful termination is returned. Otherwise the status returned is implementation-defined.