C之main函数和命令行参数(三十)-创新互联

    我们知道在 C 语言中,程序是从 main 函数开始运行的,我们称其为主函数。我们来看看下面几种 main 函数定义正确吗?

公司主营业务:网站设计制作、网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联建站是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联建站推出兴山免费做网站回馈大家。

C之main函数和命令行参数(三十)

        那么 main 函数的原型到底是什么呢?我们来看看编译器怎么说,我们分别编译下四种 main

 函数的形式,经过编译后,程序可以编译通过并且执行完成。那么最标准的 main 函数的原型是上面的第四种,main 函数是操作系统调用的函数,操作系统总是将 main 函数作为应用程序的开始并且将 main 函数的返回值作为应用程序的退出状态。那么 C 编译器为什么要支持这么多不同的 main 函数原型呢?我们来做个实验,代码如下

#include <stdio.h>

int main()
{
    printf("hello\n");
    
    return 99;
}

        我们在 BCC 编译器下编译看看,结果肯定是打印 hello 了。但是我们返回的是 99,我们顺便打印下环境变量的值,看看有什么玄机

C之main函数和命令行参数(三十)

        我们看到打印的环境变量的值为 99。如果我们将上面程序中的 return 后面改成 0。再来编译看下环境变量的值是多少

C之main函数和命令行参数(三十)

        我们看到环境变量的值变成 0 了。那么 main 函数的返回值是将它返回到系统中并保存下来。那么回到我们之前所说的问题,在以前的程序中,好多中编程写法。我们为了兼容以前所有的程序,编译器就必须得支持所有的 main 函数的写法。那么程序执行时可以向 main 函数传递参数,格式:int main(int argc, char *argv[], char *env[])。a> argc - 命令行参数个数;b> argv - 命令行参数数组;c> env - 环境变量数组;我们平时见到的大多数是带前两种的 main 函数的写法。

        那么在gcc编译器中,常见用法如下:

C之main函数和命令行参数(三十)

        我们下来看个示例代码,代码如下

#intclude <stdio.h>

int main(int argc, char* argv[], char* env[])
{
    int i = 0;
    
    printf("============== Begin argv ==============\n");
    
    for(i=0; i<argc; i++)
    {
        printf("%s\n", argv[i]);
    }
    
    printf("============== End argv ==============\n");
    
    return 0;
}

        我们来看看编译效果

C之main函数和命令行参数(三十)

        我们可以看到打印出了 ./a.out。也就是说打印出了除过 gcc 以外的命令行参数,我们再以下面这种方式来打印呢

C之main函数和命令行参数(三十)

        那么我们可以看到打印出了除 gcc 以外的所有参数。讲到最后,我们再来讨论个有意思的问题:main 函数一定是程序执行的第一个函数吗?咋一听,就是啊,我们平时书上所见到的,还有老师说的都是这样的哈。那么我们来做个实验,代码如下

#include <stdio.h>

#ifndef __GNUC__
#define __attribute__(x) 
#endif

__attribute__((constructor))
void before_main()
{
    printf("%s\n",__FUNCTION__);
}

__attribute__((destructor)) 
void after_main()
{
    printf("%s\n",__FUNCTION__);
}

int main()
{
    printf("%s\n",__FUNCTION__);
    
    return 0;
}

        我们看到如果是 GUNC 编译器的话,便定义 __attribute__ 宏。通过这个宏,我们分别声明了两个函数,我们来看看编译结果

C之main函数和命令行参数(三十)

        我们看到竟然在 main 函数的前后分别执行了这两个函数。感觉很神奇,那么这个 __attribute__ 宏便是我们 gcc 编译器所特有的属性关键字。使用就可以在 main 函数的执行前后再去执行别的函数。我们再来看看在 BCC 编译器中,它还支持吗

C之main函数和命令行参数(三十)

        我们看到它不支持那个 __FUNCTION__ ,我们便将他换成对应的字符串。编译后的结果是只打印了 main,也就是说它在 main 函数前后并没有去执行那两个函数。所以这个特性也是编译器特有支持的,但起码说明了在现代编译器中支持在 main 函数前调用其他函数。

        欢迎大家一起来学习 C 语言,可以加我QQ:243343083。

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

当前标题:C之main函数和命令行参数(三十)-创新互联
转载来源:https://www.cdcxhl.com/article4/diiiie.html

成都网站建设公司_创新互联,为您提供品牌网站制作云服务器手机网站建设网站制作定制开发网页设计公司

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

手机网站建设