关于void main(void)的错误
2010-10-15 22:19
302 查看
在x86+windows环境下,或许许多处理器和操作系统环境这样写,都没有问题。
虽然我一直知道,
int main(void) {
return 0;
}
int main(int argc,char**argv)
{
return 0;
}
这种写法是c99标准里面规定的。
但我不知道为什么会是这样。
所以经常也时常写成void main(void)
但是从可移植性的角度,和编译器的角度来看的话。
返回一个int型别的值,在很多方面是有好处。
写成上面两种形式是有原因的:
1.标准是这么规定的。
2.因为呼叫main()函数的环境启动例程(start routine)已经假设了这样一种情况:返回值会被压入栈内。如果main()没有做这件事情,
然后这会导致stack corruption 在程序退出的代码序列里面,而且会导致程序崩溃。
3.因为你那样做,会在你的调用环境里面返回一个随机的值。这样是很糟糕的,因为如果someone 想要检查你的程序是否运行失败,或者从mkefile里面调用你的程序,但他们并不能保证这样一个事实:返回的非零值表明program failed(程序没能正常结束).
但在http://users.aber.ac.uk/auj/voidmain.shtml上给出了一种出错的例子。
在 RISC OS is the native operating system of Acorn's range of ARM based computers环境下,
void main(void)产生了错误。至于是怎么个情况,还有待细究。详见http://users.aber.ac.uk/auj/voidmain.shtml
虽然我一直知道,
int main(void) {
return 0;
}
int main(int argc,char**argv)
{
return 0;
}
这种写法是c99标准里面规定的。
但我不知道为什么会是这样。
所以经常也时常写成void main(void)
但是从可移植性的角度,和编译器的角度来看的话。
返回一个int型别的值,在很多方面是有好处。
写成上面两种形式是有原因的:
1.标准是这么规定的。
2.因为呼叫main()函数的环境启动例程(start routine)已经假设了这样一种情况:返回值会被压入栈内。如果main()没有做这件事情,
然后这会导致stack corruption 在程序退出的代码序列里面,而且会导致程序崩溃。
3.因为你那样做,会在你的调用环境里面返回一个随机的值。这样是很糟糕的,因为如果someone 想要检查你的程序是否运行失败,或者从mkefile里面调用你的程序,但他们并不能保证这样一个事实:返回的非零值表明program failed(程序没能正常结束).
但在http://users.aber.ac.uk/auj/voidmain.shtml上给出了一种出错的例子。
在 RISC OS is the native operating system of Acorn's range of ARM based computers环境下,
void main(void)产生了错误。至于是怎么个情况,还有待细究。详见http://users.aber.ac.uk/auj/voidmain.shtml
相关文章推荐
- void main(void) - 错误的用法
- 关于Linux下C编译错误(警告)cast from 'void*' to 'int' loses precision
- 关于这样的错误 libcpmtd.lib(string.obj) : error LNK2005: "public: void __thiscall
- 关于编译Lambda时报告返回的为void的错误
- 关于编译Lambda时报告返回的为void的错误
- 关于main() /int main() /int main(void) /void main() /int main(int argc, char*argv[])
- 关于Linux下C编译错误(警告)cast from 'void*' to 'int' loses precision
- 关于这样的错误 libcpmtd.lib(string.obj) : error LNK2005: "public: void __thiscall
- Linux系统平台下关于GCC编译及使用的方法(-Werror,它要求GCC将所有的警告当成错误进行处理 )
- 关于prefix的错误
- 关于oop定位错误的学习
- 关于10g DG中的ORA-19527和ORA-00312错误解决示例
- 关于Provider (0x80004005)错误'80004005' 未指定的错误的解决方法
- 【Java】关于java.lang.UnsupportedOperationException异常错误的处理
- 关于问题short s1 = 1; s1 = s1 + 1;出现编译错误,而 short s1 = 1; s1 += 1;不出现编译错误。
- 关于_com_util::ConvertBSTRToString”: 编译错误问题
- 关于tomcat内存检查的错误
- 请教高手,关于webbrowser中过滤掉网页错误!
- 关于C++ int中溢出显示错误的底层原理
- 关于插入排序的逻辑错误和思想