zoukankan      html  css  js  c++  java
  • 第33课 main函数与命令行参数

    main函数的概念:

    测试程序:

    以上四种定义main函数的方法都是正确的。

    main函数的本质:

    操作系统是希望main函数的有返回值的,这样可以知道main函数的退出状态。

    如果程序时异常退出的,在有的系统上面,会得到提示:程序异常退出。

    C编译器支持多种不同的main函数原型,因为在早期有C语言,但是没有复杂的操作系统,有些程序甚至直接跑在裸机上,这样的程序的返回值也没有什么意义。所以,由于历史的原因,使得C编译器支持多种不同的main函数原型。

    main函数返回值示例程序:

    在bcc下的返回值如下:

    两个程序可以连着运行:

    如果B.exe的返回值是0,则A.exe就会运行,否则不运行。

    反过来运行结果如下:

    这种使用&&连着运行程序的语法就是操作系统的批处理语法。在linux下就是shell脚本。

    我们的main函数最好写成具有int返回值的形式,因为这样就可以将它当做黑盒在批处理语言中通过if 或者其他语句判断返回值,并执行其它操作。

     

    main函数的参数:

    gcc编译器常见用法:

    示例程序:

     1 #include <stdio.h>
     2 
     3 int main(int argc, char* argv[], char* env[])
     4 {
     5     int i = 0;
     6     
     7     printf("============== Begin argv ==============
    ");
     8     
     9     for(i=0; i<argc; i++)
    10     {
    11         printf("%s
    ", argv[i]);
    12     }
    13     
    14     printf("============== End argv ==============
    ");
    15     
    16     printf("
    ");
    17     printf("
    ");
    18     printf("
    ");
    19     
    20     printf("============== Begin env ==============
    ");
    21     
    22     for(i=0; env[i]!=NULL; i++)
    23     {
    24         printf("%s
    ", env[i]);
    25     }
    26     
    27     printf("============== End env ==============
    ");
    28 
    29     return 0;
    30 }

    argv中的个数是由argc指示的,但是env变量并没有指示其中有多少条环境变量信息,我们只能通过判断空指针来确定。

    运行结果如下:

    注释掉第24行运行结果如下:

    小技巧:

    gcc中的属性关键字:

     1 #include <stdio.h>
     2 
     3 #ifndef __GNUC__
     4 #define __attribute__(x) 
     5 #endif
     6 
     7 __attribute__((constructor))
     8 void before_main()
     9 {
    10     printf("%s
    ",__FUNCTION__);
    11 }
    12 
    13 __attribute__((destructor)) 
    14 void after_main()
    15 {
    16     printf("%s
    ",__FUNCTION__);
    17 }
    18 
    19 int main()
    20 {
    21     printf("%s
    ",__FUNCTION__);
    22     
    23     return 0;
    24 }

    第三行先判断当前的编译器是否为gcc编译器,如果不是的话,会定义第4行的宏。

    第7行的命令告诉编译器,在调用main之前,先调用before_main函数。而after_main是在main函数执行结束后调用。

    运行结果如下:

    __FUNCTION__是在gcc编译器中定义的。属于语言的扩展,其他编译器不一定存在。在bcc中是不存在这个关键字的。

     回答上面的问题:

    main函数不一定是第一个执行的函数。

    有属性扩展的编译器中,我们可以人为的在main函数之前加上其它函数。在没有属性扩展的编译器中,main函数是第一个执行的。

    小结:

  • 相关阅读:
    检索通讯录,根据输入的电话号码的每一位下拉显示检索结果
    获取手机的具体型号 及 iOS版本号
    在iOS中使用ZBar扫描二维码
    iOS沙盒路径的查看和使用
    ios打开通讯录及点击通讯录时提取相关信息
    获取倒计时距离某一时间点的时间,判断身份证,电话号码格式是否正确的简单封装
    iOS 获取手机的型号,系统版本,软件名称,软件版本
    第三天战略会议
    第二天站略会议总结
    第一天站略会议总结
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9545168.html
Copyright © 2011-2022 走看看