在C和C ++中定义main()
函数的正确(最有效)方法是什么— int main()
或void main()
—为什么? 如果int main()
return 1
或return 0
?
此问题有很多重复项,包括:
- C的
main()
函数的有效签名是什么? -
main()
函数的返回类型 -
void main()
和int main()
之间的区别? - C ++中
main()
的签名 -
main()
的正确声明是什么? —对于C ++,确实有很好的答案。 - C语言中
main()
函数的样式 - C语言中
main()
方法的返回类型 -
int main()
与void main()
有关:
- C ++ —
int main(int argc, char **argv)
- C ++ —
int main(int argc, char *argv[])
-
char *envp[]
作为main()
的第三个参数是否可移植? -
int main()
函数是否必须在所有编译器中返回一个值? - 为什么C和C ++中的
main()
函数的类型留给用户定义? - 为什么
int main(){}
编译? - C ++ 14中
main()
法律定义?
#1楼
返回0应该告诉程序员程序已成功完成工作。
#2楼
标准C —托管环境
对于托管环境(这是正常的环境),C11标准(ISO / IEC 9899:2011)指出:
5.1.2.2.1程序启动
程序启动时调用的函数名为
main
。 该实现没有为此函数声明任何原型。 它应使用返回类型int
且不带参数来定义:int main(void) { /* ... */ }
或带有两个参数(尽管可以使用任何名称,但在此处称为
argc
和argv
,因为它们是声明它们的函数的局部名称):int main(int argc, char *argv[]) { /* ... */ }
或同等学历; 10)或其他实现定义的方式。
如果声明了它们,则主函数的参数应遵循以下约束:
argc
的值应为非负数。argv[argc]
应为空指针。- 如果
argc
的值大于零,则数组成员argv[0]
至argv[argc-1]
包含在内)应包含指向字符串的指针,主机环境在程序启动之前将其指定为实现定义的值。 目的是从宿主环境中的其他位置向程序提供在程序启动之前确定的信息。 如果主机环境不能提供带有大写和小写字母的字符串,则实现应确保以小写形式接收字符串。- 如果
argc
的值大于零,则argv[0]
指向的字符串表示程序名称; 如果程序名称在主机环境中不可用,则argv[0][0]
应为空字符。 如果argc
的值大于1,则argv[1]
到argv[argc-1]
指向的字符串代表程序参数。- 参数
argc
和argv
以及argv
数组所指向的字符串应可由程序修改,并在程序启动和程序终止之间保留其最后存储的值。10)因此,
int
可以通过定义为typedef名称替换int
,或类型argv
可以写为char **argv
,依此类推。
C99或C11中的程序终止
从main()
返回的值以实现定义的方式传输到“环境”。
5.1.2.2.3程序终止
1如果
main
函数的返回类型是与int
兼容的类型,则从初始调用到main
函数的返回等同于以main
函数返回的值作为参数来调用exit
函数; 11)到达终止main
函数的}
,返回值为0。如果返回类型与int
不兼容,则未指定返回主机环境的终止状态。11)根据6.2.4,在
main
声明具有自动存储持续时间的对象的生存期将在前一种情况下终止,即使在后者没有的情况下也是如此。
请注意,将0
强制为“成功”。 如果愿意,可以使用<stdlib.h>
EXIT_FAILURE
和EXIT_SUCCESS
,但是0已很好建立,1也是如此。另请参见大于255的退出代码-可能吗? 。
在C89中(因此在Microsoft C中),没有关于main()
函数返回但未指定返回值的情况的声明。 因此,它导致不确定的行为。
7.22.4.4
exit
功能¶5最后,控制权返回到主机环境。 如果
status
的值为零或EXIT_SUCCESS
,则返回实现定义的状态成功终止的形式。 如果status
值为EXIT_FAILURE
,则返回实现定义的状态,表示状态失败终止 。 否则,返回的状态是实现定义的。
标准C ++ —托管环境
C ++ 11标准(ISO / IEC 14882:2011)指出:
3.6.1主要功能[basic.start.main]
¶1程序应包含一个称为main的全局函数,这是程序的指定开始位置。 [...]
¶2实现不得预定义主要功能。 此功能不得重载。 它的返回类型应该是int类型,否则它的类型是实现定义的。 所有实现应允许以下两个main定义:
int main() { /* ... */ }
和
int main(int argc, char* argv[]) { /* ... */ }
在后一种形式中,
argc
是从运行程序的环境传递到程序的参数数量。 如果argc
为非零,则这些参数必须通过argv[argc-1]
在argv[0]
提供,作为指向以空字符结尾的多字节字符串(NTMBS)(17.5.2.1.4.2)的初始字符的指针,而argv[0]
为指向NTMBS初始字符的指针,代表用于调用程序的名称或""
。argc
的值应为非负数。argv[argc]
的值应为0。[注意:建议在argv
之后添加任何其他(可选)参数。 —尾注]¶3函数
main
不得在程序内使用。main
的链接(3.5)是实现定义的。 [...]¶5main中的return语句的作用是保留main函数(以自动存储持续时间销毁任何对象)并以返回值作为参数调用
std::exit
。 如果控制在没有遇到return语句的情况下到达了main的末尾,则其结果是执行return 0;
C ++标准明确表示“ [[主函数]应具有类型为int
的返回类型,但否则其类型是实现定义的”,并且需要与C标准相同的两个签名作为选项来支持。 因此,C ++标准直接不允许使用“ void main()”,尽管它无法停止允许替代方法的非标准实现。 请注意,C ++禁止用户调用main
(但C标准不这样做)。
有§18.5 开始的在C ++ 11标准段落和终止是与从§7.22.4.4段落的exit
在C11标准函数 (上面引述的),除了一个脚注(其简单地文档EXIT_SUCCESS
和EXIT_FAILURE
在<cstdlib>
中定义)。
标准C —通用扩展
传统上,Unix系统支持第三个变体:
int main(int argc, char **argv, char **envp) { ... }
第三个参数是一个以空值终止的字符串指针列表,每个字符串都是一个环境变量,该环境变量具有名称,等号和值(可能为空)。 如果不使用它,您仍然可以通过' extern char **environ;
获取extern char **environ;
'。 长期以来,它没有声明它的标头,但是POSIX 2008标准现在要求在<unistd.h>
声明它。
这是C标准认可的通用扩展,记录在附件J中:
J.5.1环境参数
¶1在托管环境中,主函数接收第三个参数
char *envp[]
,它指向以char
结尾的以空char
结尾的指针数组,每个指针都指向一个字符串,该字符串为执行提供有关环境的信息程序(5.1.2.2.1)。
微软C
Microsoft VS 2010编译器很有趣。 该网站说:
main的声明语法是
int main();
或者(可选)
int main(int argc, char *argv[], char *envp[]);
或者,可以将
main
和wmain
函数声明为返回void
(无返回值)。 如果将main
或wmain
声明为返回void,则不能使用return语句将退出代码返回到父进程或操作系统。 要在main
或wmain
声明为void
时返回退出代码,必须使用exit
函数。
对我来说,尚不清楚当具有void main()
的程序确实退出时会发生什么(退出代码返回给父级或OS)—并且MS网站也保持沉默。
有趣的是,MS没有规定C和C ++标准要求的main()
的两个参数版本。 它仅规定了三个参数形式,其中第三个参数是char **envp
,它是指向环境变量列表的指针。
Microsoft页面还列出了其他一些替代方法— wmain()
需要宽字符串,还有其他一些替代方法。
此页的Microsoft Visual Studio 2005版本没有列出void main()
作为替代方案。 从Microsoft Visual Studio 2008开始的版本都可以。
标准C-独立环境
如前所述,以上要求适用于托管环境。 如果您使用的是独立式环境(这是托管环境的替代方案),那么该标准就没什么好说的了。 对于独立的环境,不需要在程序启动时调用函数main
并且对其返回类型没有限制。 该标准说:
5.1.2执行环境
定义了两个执行环境:独立和托管。 在这两种情况下,当执行环境调用指定的C函数时,都会发生程序启动。 程序启动前,所有具有静态存储持续时间的对象都应初始化(设置为其初始值)。 否则未指定这种初始化的方式和时间。 程序终止将控制权返回到执行环境。
5.1.2.1独立环境
在独立的环境中(其中C程序的执行可能没有操作系统的任何好处),程序启动时调用的函数的名称和类型是实现定义的。 除了第4节所要求的最小设置外,独立程序可用的任何库功能都是实现定义的。
在独立环境中程序终止的效果是实现定义的。
交叉引用第4条“一致性”是指:
¶5 严格符合标准的程序应仅使用本国际标准中指定的语言和库的那些功能。 3)它不应产生依赖于任何未指定,未定义或实现定义的行为的输出,并且不得超过任何最小实现限制。
¶6符合的实现的两种形式是托管的和独立的 。 合格的托管实施应接受任何严格合格的程序。 符合标准的独立实现应接受任何严格符合标准的程序,其中对库子句(第7节)中指定的功能的使用仅限于标准标头
<float.h>
,<iso646.h>
和<limits.h>
,<stdalign.h>
,<stdarg.h>
,<stdbool.h>
,<stddef.h>
,<stdint.h>
和<stdnoreturn.h>
。 符合条件的实现可以具有扩展(包括其他库函数),前提是它们不会改变任何严格符合程序的行为。 4)¶7 合格程序是合格实现可接受的程序 。 5)
3)严格符合条件的程序可以使用条件功能(请参阅6.10.8.3),前提是该使用受到使用相关宏的适当的条件包含预处理指令的保护。 例如:
#ifdef __STDC_IEC_559__ /* FE_UPWARD defined */ /* ... */ fesetround(FE_UPWARD); /* ... */ #endif
4)这意味着符合标准的实现除了本国际标准中明确保留的标识符外,不保留其他标识符。
5)严格符合标准的程序旨在在符合标准的实现中最大程度地移植。 合格程序可能取决于合格实施的非便携式功能。
值得注意的是,在独立环境中,实际上定义任何功能的唯一标头是<stdarg.h>
(甚至那些可能是-而且经常是-只是宏)。
标准C ++ —独立环境
正如C标准可以识别托管环境和独立环境一样,C ++标准也可以识别。 (引自ISO / IEC 14882:2011。)
1.4实施合规性[intro.compliance]
¶7定义了两种实现: 托管实现和独立实现 。 对于托管实施,此国际标准定义了可用库的集合。 独立的实现是可以在不借助操作系统的情况下进行执行的独立实现,并且具有一组实现定义的库,其中包括某些语言支持库(17.6.1.3)。
¶8符合标准的实现可以具有扩展(包括附加的库函数),只要它们不改变任何格式良好的程序的行为即可。 需要实施以诊断使用根据本国际标准格式错误的扩展程序的程序。 但是,这样做后,他们可以编译和执行此类程序。
¶9每个实现都应包括文档,该文档标识它不支持的所有条件支持的构造,并定义所有特定于语言环境的特征。 3
3)该文档还定义了实现定义的行为; 参见1.9。
17.6.1.3独立实施[遵从性]
定义了两种实现:托管和独立(1.4)。 对于托管实施,此国际标准描述了可用的标头集。
独立的实现具有实现定义的标头集。 该集合至少应包括表16中所示的标头。
标头
<cstdlib>
的提供的版本至少应声明函数abort
,atexit
,at_quick_exit
,exit
和quick_exit
(18.5)。 该表中列出的其他标头应满足与托管实现相同的要求。表16 —独立实现的C ++标头
Subclause Header(s) <ciso646> 18.2 Types <cstddef> 18.3 Implementation properties <cfloat> <limits> <climits> 18.4 Integer types <cstdint> 18.5 Start and termination <cstdlib> 18.6 Dynamic memory management <new> 18.7 Type identification <typeinfo> 18.8 Exception handling <exception> 18.9 Initializer lists <initializer_list> 18.10 Other runtime support <cstdalign> <cstdarg> <cstdbool> 20.9 Type traits <type_traits> 29 Atomics <atomic>
在C中使用int main()
怎么样?
C11标准的标准§5.1.2.2.1显示了首选的表示法-int int main(void)
-但该标准中还有两个示例显示了int main()
: §6.5.3.4¶8和§6.7.6.3 ¶20 。 现在,重要的是要注意示例不是“规范性的”。 它们仅是说明性的。 如果示例中有错误,则它们不会直接影响标准的正文。 也就是说,它们强烈指示了预期的行为,因此,如果在示例中标准包含int main()
,则表明即使不是首选表示法,也不禁止int main()
。
6.5.3.4
sizeof
和_Alignof
运算符…
¶8示例3在此示例中,计算可变长度数组的大小并从函数返回:
#include <stddef.h> size_t fsize3(int n) { char b[n+3]; // variable length array return sizeof b; // execution time sizeof } int main() { size_t size; size = fsize3(10); // fsize3 returns 13 return 0; }
#3楼
main
的返回值指示程序如何退出。 正常退出由main
的0返回值表示。 非零返回信号指示异常退出,但是对于如何解释非零代码没有标准。 正如其他人所指出的,C ++标准禁止void main()
,并且不应使用它。 有效的C ++ main
签名是:
int main()
和
int main(int argc, char* argv[])
相当于
int main(int argc, char** argv)
还值得注意的是,在C ++中,可以将int main()
保留为不带返回语句,此时它默认返回值为0。C99程序也是如此。 是否return 0;
是否应省略还是值得商debate。 有效的C程序主签名的范围要大得多。
效率不是main
功能的问题。 根据C ++标准,它只能输入和保留一次(标记程序的开始和终止)。 对于C,允许重新输入main()
,但应避免输入。
#4楼
成功返回0,错误返回非零。 这是UNIX和DOS脚本用来查找程序发生了什么的标准。
#5楼
我相信main()
应该返回EXIT_SUCCESS
或EXIT_FAILURE
。 它们在stdlib.h
中定义
#6楼
我的印象是,标准指定main不需要返回值,因为成功的返回是基于OS的(一个为零可能是另一个成功或失败),因此,没有返回是提示的暗示。编译器插入成功返回本身。
但是我通常返回0。
#7楼
请记住,即使您要返回一个int,某些操作系统(Windows)也会将返回的值截断为一个字节(0-255)。
#8楼
可接受的答案似乎是针对C ++的,因此我想添加一个与C有关的答案,这在某些方面有所不同。
ISO / IEC 9899:1989(C90):
main()
应该声明为:
int main(void)
int main(int argc, char **argv)
或同等学历。 例如, int main(int argc, char *argv[])
等效于第二个。 此外,可以将int
返回类型省略,因为它是默认值。
如果实现允许,则可以通过其他方式声明main()
,但这使程序实现已定义,并且不再严格遵循。
该标准定义了三个严格符合要求的返回值(即,不依赖于实现定义的行为): 0
和EXIT_SUCCESS
表示成功终止, EXIT_FAILURE
表示终止失败。 任何其他值都是非标准的,并且定义为实现。 main()
必须在末尾具有显式的return
语句,以避免未定义的行为。
最后,从标准的角度来看,从程序中调用main()
并没有错。
ISO / IEC 9899:1999(C99):
对于C99,除以下内容外,其他均与上面相同:
-
int
返回类型不能省略。 - 您可以省略
main()
的return语句。 如果这样做,并且main()
完成,则隐式return 0
。
#9楼
这是返回码用法的一个小例子...
当使用Linux终端提供的各种工具时,可以在过程完成后使用返回码进行错误处理。 假设存在以下文本文件myfile:
这是为了检查grep如何工作的一些示例。
当执行grep命令时,将创建一个进程。 一旦通过(并且没有中断),它将返回0到255之间的一些代码。例如:
$ grep order myfile
如果你这样做
$ echo $?
$ 0
您将得到0。为什么? 因为grep找到一个匹配项并返回了退出代码0,这是成功退出的通常值。 让我们再次检查一下,但文本文件中未包含某些内容,因此找不到匹配项:
$ grep foo myfile
$ echo $?
$ 1
由于grep无法将令牌“ foo”与文件的内容匹配,因此返回码为1(这是发生失败的常见情况,但如上所述,您可以选择很多值)。
现在,下面的bash脚本(只需在Linux终端中键入它)虽然很基础,但应该给出一些错误处理的想法:
$ grep foo myfile
$ CHECK=$?
$ [ $CHECK -eq 0] && echo 'Match found'
$ [ $CHECK -ne 0] && echo 'No match was found'
$ No match was found
在第二行之后,由于“ foo”使grep返回1,因此没有任何内容输出到终端,我们检查grep的返回码是否等于0。由于CHECK,第二条条件语句为true,因此第二条条件语句在最后一行回显其消息。 == 1。
正如您所看到的,如果您正在调用该进程,则有时必须查看返回的内容(通过main()的返回值)。
#10楼
请注意,C和C ++标准定义了两种实现:独立的和托管的。
C90托管环境
允许的形式1 :
int main (void) int main (int argc, char *argv[]) main (void) main (int argc, char *argv[]) /*... etc, similar forms with implicit int */
评论:
前两个明确表示为允许的形式,其他两个则隐式允许,因为C90允许对返回类型和函数参数使用“隐式int”。 不允许其他形式。
C90独立式环境
main的任何形式或名称都是允许的2 。
C99托管环境
允许的表格3 :
int main (void) int main (int argc, char *argv[]) /* or in some other implementation-defined manner. */
评论:
C99删除了“隐式int”,因此
main()
不再有效。引入了一个奇怪的,模棱两可的句子“或以其他实现方式定义的方式”。 这可以解释为“
int main()
的参数可能有所不同”或“ main可以具有任何实现定义的形式”。一些编译器选择以后一种方式解释该标准。 可以说,由于标准本身是模棱两可的,因此无法轻易地通过引用标准本身来声明它们未严格遵守标准。
但是,允许
main()
完全使用狂野形式不是这个新句子的意图。 C99基本原理(非规范性)意味着该句子引用了int main
4的附加参数。但是,托管环境程序终止的部分然后继续讨论main不返回int 5的情况 。 尽管该部分并未就应如何声明main进行规范,但它绝对意味着即使在托管系统上,也可能以完全实现定义的方式声明main。
C99独立式环境
主体的任何形式或名称都是允许的6 。
C11托管环境
允许的表格7 :
int main (void) int main (int argc, char *argv[]) /* or in some other implementation-defined manner. */
C11独立式环境
主体的任何形式或名称都是允许的8 。
请注意,对于以上任何版本的C的任何托管实现, int main()
从未被列为有效形式。 在C中,与C ++不同, ()
和(void)
具有不同的含义。 前者是一种过时的功能,可以从语言中删除。 请参阅C11将来的语言说明:
6.11.6函数声明符
使用带有空括号的函数声明符(不是原型格式的参数类型声明符)是过时的功能。
C ++ 03托管环境
允许的表格9 :
int main () int main (int argc, char *argv[])
评论:
请注意第一种形式的空括号。 在这种情况下,C ++和C是不同的,因为在C ++中,这意味着该函数不接受任何参数。 但是在C语言中,它意味着可以使用任何参数。
C ++ 03独立式环境
启动时调用的函数的名称是实现定义的。 如果将其命名为
main()
则必须遵循规定的格式10 :// implementation-defined name, or int main () int main (int argc, char *argv[])
C ++ 11托管环境
允许的表格11 :
int main () int main (int argc, char *argv[])
评论:
标准文本已更改,但含义相同。
C ++ 11独立环境
启动时调用的函数的名称是实现定义的。 如果将其命名为
main()
则必须遵循规定的格式12 :// implementation-defined name, or int main () int main (int argc, char *argv[])
参考文献
ANSI X3.159-1989 2.1.2.2托管环境。 “程序启动”
在程序启动时调用的函数称为main。 该实现没有为此函数声明任何原型。 它应使用返回类型int且不带参数来定义:
int main(void) { /* ... */ }
或带有两个参数(尽管可以使用任何名称,但在此处称为argc和argv,因为它们是声明它们的函数的局部名称):
int main(int argc, char *argv[]) { /* ... */ }
ANSI X3.159-1989 2.1.2.1独立环境:
在独立的环境中(其中C程序的执行可能没有操作系统的任何好处),程序启动时调用的函数的名称和类型是实现定义的。
ISO 9899:1999 5.1.2.2托管环境-> 5.1.2.2.1程序启动
在程序启动时调用的函数称为main。 该实现没有为此函数声明任何原型。 它应使用返回类型int且不带参数来定义:
int main(void) { /* ... */ }
或带有两个参数(尽管可以使用任何名称,但在此处称为argc和argv,因为它们是声明它们的函数的局部名称):
int main(int argc, char *argv[]) { /* ... */ }
或等效; 9)或以其他一些实现定义的方式。
国际标准的理由-编程语言-C,修订版5.10。 5.1.2.2托管环境-> 5.1.2.2.1程序启动
main的参数行为以及exit,main和atexit的交互行为(请参见第7.20.4.2节)已被编码,以抑制argv字符串表示以及main返回的值的含义中的某些不必要的变化。
argc和argv作为main参数的规范已得到广泛认可。 argv [argc]也必须是空指针,以根据常规惯例对列表的末尾提供冗余检查。
main是唯一可以用零或两个参数声明的函数。 (其他函数的参数数目必须在调用和定义之间完全匹配。)这种特殊情况只是承认了广泛的做法,即当程序不访问程序参数字符串时,将参数保留给main。 尽管许多实现支持对main的两个以上论点,但该实践并没有受到标准的祝福或禁止; 用三个参数定义main的程序不是严格符合的(请参见§J.5.1。)。
ISO 9899:1999 5.1.2.2托管环境-> 5.1.2.2.3程序终止
如果主函数的返回类型是与int兼容的类型,则从初始调用到主函数的返回等同于以主函数返回的值作为其参数来调用退出函数; 11)到达
}
终止主函数返回值0。如果返回类型与int不兼容,则未指定返回到主机环境的终止状态。ISO 9899:1999 5.1.2.1独立环境
在独立的环境中(其中C程序的执行可能没有操作系统的任何好处),程序启动时调用的函数的名称和类型是实现定义的。
ISO 9899:2011 5.1.2.2托管环境-> 5.1.2.2.1程序启动
本部分与以上引用的C99相同。
ISO 9899:1999 5.1.2.1独立环境
本部分与以上引用的C99相同。
ISO 14882:2003 3.6.1主要功能
实现不得预定义主要功能。 此功能不得重载。 它的返回类型应该是int类型,否则它的类型是实现定义的。 所有实现应允许以下两个main定义:
int main() { /* ... */ }
和
int main(int argc, char* argv[]) { /* ... */ }
ISO 14882:2003 3.6.1主要功能
是否需要独立环境中的程序来定义主要功能由实现定义。
ISO 14882:2011 3.6.1主要功能
实现不得预定义主要功能。 此功能不得重载。 它的返回类型应该是int类型,否则它的类型是实现定义的。 所有实现都应允许
—()返回int和的函数
—(int,指向char的指针的指针)返回int的函数
作为主要类型(8.3.5)。
ISO 14882:2011 3.6.1主要功能
本部分与以上引用的C ++ 03相同。
#11楼
忽略return 0
当C或C ++程序到达main
的末尾时,编译器将自动生成返回0的代码,因此无需将return 0;
放回原处return 0;
在main
的末尾显式。
注意:当我提出此建议时,几乎总是会出现以下两种评论之一:“我不知道。” 或“那是个坏建议!” 我的理由是,依靠该标准明确支持的编译器行为既安全又有用。 对于C,自C99起; 参见ISO / IEC 9899:1999第5.1.2.2.3节:
[...]从初始调用到
main
函数的返回等同于以main
函数返回的值作为参数来调用exit
函数; 到达终止main
函数的}
会返回值0。
对于C ++,自1998年发布第一个标准以来; 参见ISO / IEC 14882:1998第3.6.1节:
如果控制在没有遇到return语句的情况下到达了main的末尾,则其结果是执行return 0的结果;
此后,这两个标准的所有版本(C99和C ++ 98)都保持了相同的想法。 我们依靠C ++中自动生成的成员函数,很少有人编写显式的return;
void
函数末尾的语句。 反对省略的原因似乎可以归结为“看起来很奇怪” 。 如果像我一样,您对更改C标准的理由感到好奇,请阅读此问题 。 还应注意,在1990年代初期,这被视为“草率做法”,因为当时它是不确定的行为(尽管得到广泛支持)。
此外,《 C ++核心准则》还包含多个省略return 0;
实例return 0;
在main
的末尾,并且没有写入显式返回的实例。 尽管该文档中还没有针对该特定主题的特定指南,但这似乎至少是对该实践的默认支持。
所以我主张省略它; 其他人则不同意(通常是非常激烈!)无论如何,如果遇到忽略该代码的代码,您将知道该标准明确支持该标准,并且您将了解其含义。
#12楼
在C和C ++中定义main()函数的正确(最有效)方法是什么— int main()或void main()—为什么?
那些词((最有效的)”不会改变问题。 除非您处于独立的环境中,否则存在一种通用的正确声明main()
,那就是返回int。
main()
在C和C ++中应该返回什么?
这不是什么都要 main()
回报,这是什么呢 main()
回报。 main()
当然是其他人调用的函数。 您对调用main()
的代码没有任何控制。 因此,必须使用正确类型的签名声明main()
才能匹配其调用者。 您在这件事上别无选择。 您不必问自己是什么效率更高或更低,或者哪种风格更好或更差,或者诸如此类,因为对于您而言,答案已经完全由C和C +标准定义。 只要跟随他们。
如果是int main(),则返回1或返回0?
0表示成功,非零表示失败。 同样,您无需(或无需选择)某些内容:它由您应该遵循的接口定义。
#13楼
如果确实有与从进程返回整数的效率有关的问题,则应避免调用该进程多次,以至于此返回值成为问题。
如果执行此操作(多次调用一个进程),则应该找到一种方法,将逻辑直接放在调用者内部或DLL文件中,而无需为每个调用分配特定的进程。 在这种情况下,多个过程分配给您带来了相关的效率问题。
详细地讲,如果您只想知道返回0的效率是否比返回1的效率高或低,在某些情况下,它可能取决于编译器,但一般而言,假定它们是从同一源读取的(本地,字段,常量,嵌入式在代码,函数结果等中),它需要完全相同的时钟周期数。
#14楼
返回什么取决于您要对可执行文件执行的操作。 例如,如果将程序与命令行外壳一起使用,则成功返回0,失败返回非零。 然后,您将能够在shell中使用程序进行条件处理,具体取决于代码的结果。 您还可以根据您的解释指定任何非零值,例如,对于严重错误,不同的程序出口点可能会终止具有不同出口值的程序,并且调用外壳程序可以使用该值,通过检查返回的值来决定要做什么。 如果该代码不适合与Shell一起使用,并且返回的值不会困扰任何人,则可以将其省略。 我个人使用签名int main (void) { .. return 0; .. }
int main (void) { .. return 0; .. }
#15楼
操作系统可以使用该返回值来检查程序是如何关闭的。
在大多数操作系统中(无论如何我都会想到),返回值0通常意味着可以。
当您自己调用一个进程时,也可以检查它,看看程序是否退出并正确完成。
这不只是一个编程约定。
#16楼
main()
的返回值显示程序如何退出。 如果返回值zero
则表示执行成功,而任何非零值都表示执行中出现问题。
#17楼
C89和K&R C未指定的返回类型中的main()
默认为'int`。
return 1? return 0?
如果您没有在
int main()
编写return语句,则闭包{
将默认返回0。父进程将接收
return 0
或return 1
。 在外壳程序中,它进入一个外壳程序变量,如果您在外壳程序中运行程序并且不使用该变量,则不必担心main()
的返回值。
请参阅如何获取主要函数返回的内容? 。
$ ./a.out
$ echo $?
这样您可以看到它是变量$?
它接收main()
返回值的最低有效字节。
在Unix和DOS脚本中,成功return 0
,错误返回非零。 这是Unix和DOS脚本编写所使用的标准,用于找出程序发生了什么并控制整个流程。