| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 608 人关注过本帖
标题:对于 void main()的错误
只看楼主 加入收藏
NeilZ
Rank: 1
等 级:新手上路
帖 子:3
专家分:2
注 册:2014-8-27
结帖率:0
收藏
 问题点数:0 回复次数:1 
对于 void main()的错误
以下观点是自我抒发以及摘录的,如有错误请大神指正:

很多人现在都在学习C或者C++的时候都习惯性地去打上  void main() ,其实这是错误的。C/C++ 中从来没有定义过void main()。本贾尼·斯特劳斯特卢普(C++之父)说过,void main() 从来就不属于C或者是C++ 。

早期的时候 main() 是可以接受的,不过在最新的 C99 标准和C++的定义中,只有以下两种定义方式是正确的:

           int main( void )

           int main( int argc, char *argv[] )

main 函数的返回值类型必须是 int ,这样返回值才能传递给程序的激活者(如操作系统)。


/////////////////////////////////////////////以下是蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有  ,尊重别人的成果。
 返回值的作用

        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 。

int main( int argc, char *argv[], char *env[] ) 也不是标准C里面定义的东西~char *env[]是某些编译器提供的扩展功能~用于获取系统的环境设定~因为不是标准~故而移植性差~不推荐使用
搜索更多相关主题的帖子: 斯特劳斯 习惯性 
2014-09-06 21:48
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
收藏
得分:0 
接受void main的是微软,当时操作系统正在改变,程序状态不再依靠返回值而是操作系统来监视。所以微软认为没有必要返回程序状态,程序奔溃也可以从列表中获取错误代码。

另外char *env[]不是什么编译器扩展,而是最原始的main入口的确是三个参数,只是后来另一个参数废弃了。
来自windows核心编程第四章:

如果编写了一个main函数,它将以下面的形式被调用:
int nMainRetVal=main(__argc,__argv,_environ);
其实在四个入口版本中main,wmain,WinMain,wWinMain都是从历史中变迁过来的。
来自windows程序开发第一章:

WinMain的第一个参数被称作「执行实体句柄」。在Windows程序设计中,句柄仅是一个应用程序用来识别某些东西的数字。在这种情况下,该句柄唯一地标识该程序,还需要它在其它Windows函数呼叫中作为参数。在Windows的早期版本中,当同时运行同一程序多次时,您便创建了该程序的「多个执行实体(multiple instances)」。同一应用程序的所有执行实体共享程序和只读的内存(通常是例如菜单和对话框模板的资源)。程序通过检查hPrevInstance参数就能够确定自身的其它执行实体是否正在运行。然后它可以略过一些繁杂的工作并从前面的执行实体将某些数据移到自己的数据区域。
在32位Windows版本中,该概念已被抛弃。传给WinMain的第二个参数总是NULL(定义为0)。

所以入口函数除了那几个参数还可以调用外其它的只需要去理解就行了。
程序代码:
//当程序挂有参数的时候直接输出参数在屏幕上
int main(int argc, char* argv[])
{
    cout<<"程序路径:"<<argv[0]<<endl;
    if(argc!=1)
    {
        cout<<"参数:"<<endl;
        for(int i=argc-1;i;i--)
        {
            cout<<argv[i];
        }
    }
    else
    {
        cout<<"应用程序没有参数";
    }
    cin.get();
    return 0;
}
2014-09-08 16:10
快速回复:对于 void main()的错误
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025064 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved