【C】 33_main 函数与命令行参数

发布时间:2019-08-06 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了【C】 33_main 函数与命令行参数脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

main 函数的概念

  • C 语言中 main 函数称之为主函数
  • 一个 C 程序是从 main 函数开始执行的

下面的 main 函数定义正确吗?

A.

main()
{
}

B.

void main()
{
}

c.

int main()
{
}

D.

int main()
{
    return 0;
}

A B C D 编译无警告,无错误,运行正常

D 为最标准

main() 函数的本质

  • main 函数是操作系统调用的函数
  • 操作系统总是将 main 函数作为应用程序的开始
  • 操作系统将 main 函数的返回值作为程序的退出状态

思考:为什么 C 编译器支持那么多不同的 main 函数元原型呢?

C 语言诞生初期就得到的广泛的应用,,当时的程序比较简单,主要应用于科学运算或嵌入式设备中。在当时的环境下,只需要知道入口函数在哪里便可以,在非操作系统中运行,返回值是无意义的。

随着商业编译器的竞争与发展,编译器开始支持更多的 C 语言特性,并对编译器的功能进行扩展。

编程实验: main 函数的返回值

A.C

#include <stdio.h>

int main()
{
    printf("I'm A!n");

    return 0;
}

B.c

#include <stdio.h>

int main()
{
    printf("I'm B!n");

    return 99;
}
命令行:【GCC】 
./a.out  && ./b.out

输出:
I'm A!
I'm B!

命令行:【GCC】
./b.out &amp;& ./a.out

输出:
I'm B!

在操作系统中的作用

操作系统中存在批处理语言。在 linux 中为 shell 脚本,其联合各种应用程序协作完成任务,通过应用程序返回值监控程序的运行状态。

main 函数的参数

  • 程序执行时可以向 main 函数传递参数

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

argc - 命令行参数个数
argv - 命令行参数数组 (命令行参数以字符串形式”存储“于指针数组中)
env - 环境变量数组 (环境变量以字符串形式“存储”于指针数组中)

  • gcc 编译器的常见用法

./a.out a.c b.c c.c

argc      --->  4
argv[0]   --->  a.out
argv[1]   --->  a.c
argv[2]   --->  b.c
argv[3]   --->  c.c

实例分析: main 函数的参数

#include <stdio.h>

int main(int argc, char* argv[], char* env[])
{
    int i = 0;
    
    printf("=============Begin argv=============n");
    
    for(i=0; i<argc; i++)
    {
        printf("%sn", argv[i]);
    }
    
    printf("=============End argv=============n");
    
    printf("n");
    printf("n");
    printf("n");
    
    printf("=============Begin env=============n");
    
    for(i=0; env[i]!=NULL; i++)
    {
        printf("%sn", env[i]);
    }
    
    printf("=============End env=============n");
}
命令行: ./a.out a.c b.c c.c
输出:
=============Begin argv=============
./a.out
a.c
b.c
c.c
=============End argv=============



=============Begin env=============
ORBIT_SOCKETDIR=/tmp/orbit-delphi
SSH_AGENT_PID=1695
TERM=xterm
SHELL=/bin/bash
XDG_SESSION_COOKIE=6c560f89cd4609726ff940b800000007-1544093738.93069-2082860285
WINDOWID=71303204

......
......

=============End env=============

实例,gcc 命令行不同参数,实现不同功能

小技巧

  • 面试中的小问题,main 函数一定是程序执行的第一个函数吗?

不一定。
在 gcc 中使用属性关键字 attribute, 可以指定 main 之前与 main 之后分别执行一个函数。
但有的编译器没有支持相关功能关键字扩展,那么 main 函数是第一个运行的函数,例BCC。

实例分析: gcc 中的属性关键字

#include <stdio.h>

#ifndef __GNC__
#define __GNU__
#endif

__attribute__((constructor))
void before_main()
{
    printf("%sn", __FUNCTION__);
}

__attribute__((destructor))
void after_main()
{
    printf("%sn", __FUNCTION__);
}

int main()
{
    printf("%sn", __FUNCTION__);
    
    return 0;
}
输出:
before_main
main
after_main

小结

  • 一个 C 程序是从 main 函数开始执行的
  • main 函数是操作系统调用的函数
  • main 函数有参数和返回值
  • 现代编译器支持在 main 函数前调用其它函数

补充:不同编译器有不同的功能扩展,为了程序的可以执性,如果不是及其特殊情况,不编写依赖编译器的代码

以上内容参考狄泰软件学院系列课程,请大家保护原创

脚本宝典总结

以上是脚本宝典为你收集整理的【C】 33_main 函数与命令行参数全部内容,希望文章能够帮你解决【C】 33_main 函数与命令行参数所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。