拜托不要再用system("pause")和void main了

stereoMatching 2012-10-01 10:54:58
1 :
不知道为何在CSDN上常看见有人宣告"void main"
这东西不是C++的標準進入點
标准只支援两种宣告
第一种"int main"
第二种"int main(int argc, char *argv[])"
宣告"void main"可能会有非预期的结果
这点不只适用于C++,C也一样管用
这是教科书的错?或者是教授们的错?

2 :
不要用system("pause")来暂停,可以改用std::cin.get或getchar()
为何不要用system("pause")?
有两个理由
一 : 不具可移植性
二 : 这东西很贵

贵在那里?让我们来看看system("pause")的流程
1 : 暂停你的程式
2 : 在sub-process中启动OS
3 : 寻找要执行的命令并为之分配记忆体
4 : 等待输入
5 : 回收记忆体
6 : 结束OS
7 : 继续你的程式
...全文
47835 37 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
fp6 2015-04-29
  • 打赏
  • 举报
回复
赞扬楼主精益求精的精神,解决办法吗,同意33楼的。
v_empire 2014-07-15
  • 打赏
  • 举报
回复
深有同感。顶!
LONG521QIN1314 2014-05-14
  • 打赏
  • 举报
回复
谢谢!在这里了解很多。
kukudi 2014-01-20
  • 打赏
  • 举报
回复
这个,强烈同意!
ThunderFAE 2012-10-05
  • 打赏
  • 举报
回复
论坛还是一如既往的看评论。。。
ResearchWorld 2012-10-05
  • 打赏
  • 举报
回复
一些 小的细节 而已 至于么
q987001 2012-10-04
  • 打赏
  • 举报
回复
建议看国外经典教材,台湾的许多书也是很烂的
Star-light 2012-10-04
  • 打赏
  • 举报
回复
无所谓的事情

反正一个程序也就一个main,能错到哪里去

system顺手就行,基本是平时做做小测试才用
wzb56 2012-10-04
  • 打赏
  • 举报
回复 1
[Quote=引用 32 楼 的回复:]

使用 CodeBlocks 没压力
C/C++ code
#include <iostream>

using namespace std;

int main()
{
cout << "Hello world!" << endl;
return 0;
}


输出
Assembly code
Hello world!

Process returned 0 (0x0)……


[/Quote]
其实,VS里,也有类似的功能。
曾经,我同学也是用vs运行程序时,总是选在debug模式下的那个三角形的,但是程序一闪而过,结果,他就
采用像lz提供的方法, system("pause"); 或者用输入的阻塞 什么 getc(), getchar()什么的;
结果,他测试一个累的析构函数调用时,结果怎么也显示不出,析构函数的中打印的语句.
后来,我告诉的他,问题就是出现在那个system()或者getc(),调用上,其实类对象的析构发生在其后,只不过显示一闪而过所以看不到。

其实,在debug选项下有个 start without debugging。

工具没用好,带来的问题!


问题1:也是应当避免的,操作系统需要应用程序,有个返回码来确定,应用程序是否正常退出。
void main() : 返回一个不确定的值;
int main(int argc, char *argv[]) : 返回一个整形的退出码。
int main(int argc, char *argv[], char *env[]): 在linux系统编程时,用过,能够使用系统的环境变量。

在windows下,测试返回码:echo %errorlevel%
在Linux下, 测试返回码: echo $?

在进行,windows下批处理编程,或者Linux的shell脚本编程,这些应用程序的返回,决定着批处理程序或者shell脚本程序的执行流程。


hongwenjun 2012-10-04
  • 打赏
  • 举报
回复
使用 CodeBlocks 没压力
#include <iostream>

using namespace std;

int main()
{
cout << "Hello world!" << endl;
return 0;
}

输出
Hello world!

Process returned 0 (0x0) execution time : 0.016 s
Press any key to continue.
赵4老师 2012-10-03
  • 打赏
  • 举报
回复
存在即合理
xspace_time 2012-10-03
  • 打赏
  • 举报
回复
vc 把void和int都处理成了ret 0 所以我还没有觉得void会有什么问题

我有时用while(!kbhit());也习惯用system("pause"); 好像没什么问题

谁能给我举个system("pause");的缺点的例子吗
卖萌de猫 2012-10-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
第一点同意 第二点 一个控制台小程序管那么过干嘛 又不是负担不起 而且要是一个getchar()不停下来怎么办 难道还来一群getchar()啊
[/Quote]一个不停就用flush吧
hasagiiiii 2012-10-03
  • 打赏
  • 举报
回复 1
这是强迫症吧。
就算你每次控制台都用system("pause");
在做实际项目的时候也不会把这个写上去吧。
[Quote=引用 22 楼 的回复:]

>第二点呢?写个控制台的测试程序还考虑这点东西,闲着没事干是吧。。。
这也是一种选择, 我个人是不会过早选择明显较差的解法
精益求精,我要求自己平时就得养成良好的编程习惯和观念
就算只是一些小小的细节,也希望能尽最大的努力做到最好

>难道还来一群getchar()啊
需要用到一群吗?
我只遇过需要多加一个std::cin.get()的情况
我想知道那些情况下需要用到一群getc……
[/Quote]
huangxy10 2012-10-03
  • 打赏
  • 举报
回复
同意~
line_us 2012-10-03
  • 打赏
  • 举报
回复
挺热闹,
不过能辨明一下也不错
SKATE11 2012-10-02
  • 打赏
  • 举报
回复
第一点同意 第二点 一个控制台小程序管那么过干嘛 又不是负担不起 而且要是一个getchar()不停下来怎么办 难道还来一群getchar()啊
SKATE11 2012-10-02
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

>第二点呢?写个控制台的测试程序还考虑这点东西,闲着没事干是吧。。。
这也是一种选择, 我个人是不会过早选择明显较差的解法
精益求精,我要求自己平时就得养成良好的编程习惯和观念
就算只是一些小小的细节,也希望能尽最大的努力做到最好

>难道还来一群getchar()啊
需要用到一群吗?
我只遇过需要多加一个std::cin.get()的情况
我想知道那些情况下需要用到一群getc……
[/Quote]
15楼回答了
ForestDB 2012-10-02
  • 打赏
  • 举报
回复
总有个过度阶段。
void main()应该算谭老的功劳。
至于system("pause");应该是VS的功劳。
0xAC 2012-10-02
  • 打赏
  • 举报
回复 1
C语言的话,没有命令行参数情况下我还是习惯int main(void)
加载更多回复(17)

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧