许多人甚至市面上的一些书籍,都利用了void main( ) ,其实这是错误的 。C/C++ 中从来没有界说过void main( ) .C++ 之父 Bjarne Stroustrup 在 他的主页上的 FAQ 中明晰地写着 The definition void main( ) { /* …… */ } is not and never has been C++, nor has it even been C.( void main( ) 从来就不存在于 C++ 可能 C )。下面我别离说一 下 C 和 C++ 尺度中对 main 函数的界说。
1. C
在 C89 中, main( ) 是可以接管的。Brian W. Kernighan 和 Dennis M. Ritchie 的经典 巨著 The C programming Language 2e(《C 措施设计语言第二版》)用的就是 main( )。不外在最新的 C99 尺度中,只有以下两种界说方法是正确的:
int main( void )
int main( int argc, char *argv[] )
(参考资料:ISO/IEC 9899:1999 (E) Programming languages — C 5.1.2.2.1 Program startup)
虽然,我们也可以做一点小小 的窜改。譬喻:char *argv[] 可以写成 char **argv;argv 和 argc 可以改成 此外变量名(如 intval 和 charval),不外必然要切合变量的定名法则。
假如不需要从呼吁行中获取参数,请用int main(void) ;不然请用 int main( int argc, char *argv[] ) .
main 函数的返回值范例必 须是 int ,这样返回值才气通报给措施的挪用者(如操纵系统)。
假如 main 函数的最后没有写 return 语句的话,C99 划定编译器要自动在生成的目 标文件中(如 exe 文件)插手return 0; ,暗示措施正常退出。不外,我照旧 发起你最亏得main函数的最后加上return 语句,固然没有这个须要,但这是一 个好的习惯。留意,vc6不会在方针文件中插手return 0; ,或许是因为 vc6 是 98 年的产物,所以才不支持这个特性。此刻大白我为什么发起你最好加上 return 语句了吧!不外,gcc3.2(Linux 下的 C 编译器)会在生成的方针文件 中插手 return 0; .
2. C++
C++98 中界说了如下两种 main 函 数的界说方法:
int main( )
int main( int argc, char *argv[] )
(参考资料:ISO/IEC 14882(1998-9-01)Programming languages — C++ 3.6 Start and termination)
int main( ) 等同于 C99 中的 int main( void ) ;int main( int argc, char *argv [] ) 的用法也和 C99 中界说的一样。同样,main 函数的返回值范例也必需是 int.假如main函数的末端没写return语句,C++98 划定编译器要自动在生成的目 标文件中插手 return 0; .同样,vc6 也不支持这个特性,可是 g++3.2 (Linux 下的 C++ 编译器)支持。
3. 关于 void main
在 C 和 C++ 中,不吸收任何参数也不返回任何信息的函数原型为“void foo (void);”。大概正是因为这个,所以许多人都误认为假如不需要措施 返回值时可以把main函数界说成void main(void) .然而这是错误的!main 函 数的返回值应该界说为 int 范例,C 和 C++ 尺度中都是这样划定的。固然在一 些编译器中,void main 可以通过编译(如 vc6),但并非所有编译器都支持 void main ,因为尺度中从来没有界说过 void main .g++3.2 中假如 main 函 数的返回值不是 int 范例,就基础通不外编译。而 gcc3.2 则会发出告诫。所 以,假如你想你的措施拥有很好的可移植性,请必然要用 int main .
4. 返回值的浸染
main 函数的返回值用于说明措施的退出状态。假如返回 0 ,则代表措施正常退出;返回其它数字的寄义则由系统抉择。凡是,返回非零代 表措施异常退出。下面我们在 winxp 情况下做一个小尝试。首先编译下面的程 序:
int main( void )
{
return 0;
}
然后打开附件里的“呼吁提示符”,在呼吁行里运行适才编译好的可 执行文件,然后输入“echo %ERRORLEVEL%”,回车,就可以看到程 序的返回值为 0 .假设适才编译好的文件是 a.exe ,假如输入“a && dir”,则会列出当前目次下的文件夹和文件。可是假如改成 “return -1”,可能此外非 0 值,从头编译后输入“a && dir”,则 dir 不会执行。因为 && 的寄义是:假如 && 前面的措施正常退出,则继承执行 && 后头的措施,不然 不执行。也就是说,操作措施的返回值,我们可以节制要不要执行下一个措施。 这就是 int main 的长处。假如你有乐趣,也可以把 main 函数的返回值范例改 成非 int 范例(如 float),从头编译后执行“a && dir”,看看会呈现什么环境,想想为什么会呈现那样的环境。顺便提一下 ,假如输入 a || dir 的话,则暗示假如 a 异常退出,则执行 dir .
5. 那么 int main( int argc, char *argv[], char *envp[] ) 呢?
这虽然也不是尺度 C/C++ 内里界说的对象!char *envp[] 是某些编译器提供的