第33课 main函数与命令行参数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第33课 main函数与命令行参数相关的知识,希望对你有一定的参考价值。

1. main函数的概念

(1)C语言中main函数称之为主函数

(2)一个程序是从main函数开始执行的

【编程实验】main函数的原型究竟是什么

//以下四个main函数都是合法的

//第1种
//main()
//{
//}

//第2种
//void main()
//{
//}

//第3种:——标准的入口函数
int main()
{
   return 0;
}

//第3种:——标准的入口函数
//int main()
//{
//   //没写返回值
//}

【思考】为什么编译器支持那么多种不同的main函数原型?

  ①历史遗留问题,C早期的程序很简单,只需程序入口地址,程序运行完,并不关心其的结束状态。

  ②后期C编译器为了兼容早期的程序和商业竞争,厂商让自己的编译器支持更多C类型的程序。

2. main函数的本质

(1)main函数是操作系统调用的函数

(2)操作系统总是将main函数作为应用程序的开始

(3)操作系统将main函数的返回值作为程序的退出代码

【编程实验】main函数的返回值

技术分享

 //A.exe

#include <stdio.h>

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

    return 0;//返回值0,表示正常结束
}

//B.exe

#include <stdio.h>

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

    return 99;//返回值非0,表示异常结束
}

【小技巧】

  ①在命令行中输入:echo %errorlevel% 可以显示一个进程执行后的退出代码

  ②在命令行中输入:a.exe && b.exe,则该命令会根据a.exe的退出状态(正常退出为TRUE,异常退出为FALSE)来决定是否执行b.exe程序(&&操作符的短路规则!

3. main函数的参数

(1)程序执行时可以向main函数传递参数

  int main();

  int main(int argc); //argc为命令行参数个数

  int main(int argc,char* argv[]);//argv为命令行参数数组

  int main(int argc,char* argv[],char* env[]);//env为环境变量数组, NULL结尾。

(2)当进程被加载时,操作系统会向进程的命令行参数一些参数。以启动gcc为例

     gcc a.c b.c c.c  //启动gcc并编译a.c、b.c、c.c三个文件

   //操作系统向进程传递进程名称(如gcc.exe)、a.cb.cc.c4个参数,其中argc为4,argv[0]为gcc.exe、argv[1]为a.c、argv[2]为b.c、argv[3]为c.c

【实例分析】main函数的参数

#include <stdio.h>

//测试时,可在命令行中启动该进程(test.exe),如
//test.exe AAA 123 bbb,则参数为4个,然后显示环境变量的信息
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");

    printf("\n");
    printf("\n");
    printf("\n");

    printf("============== Begin env ===============\n");
    for(i = 0; env[i] != NULL; i++)
    {
        printf("%s\n",env[i]);
    }
    printf("============== End env =================\n");
    
    return 0;
}

4. 经典问题——main函数一定是程序执行的第一个函数吗?

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

#include <stdio.h>

//非GCC编译器下,将__attribute__(x)宏定义为空
#ifndef __GNUC__
#define 
#endif

__attribute__((constructor))
void before_main()
{
    printf("%s\n",__FUNCTION__); //__FUNCTION__为当前函数名称
}

__attribute__((destructor))
void after_main()
{
    printf("%s\n",__FUNCTION__); //__FUNCTION__为当前函数名称
}


int main(int argc,char* argv[], char* env[])
{
    printf("%s\n",__FUNCTION__);
    
    return 0;
}

//最终显示结果:
//before_main 
//main
//after_main

5.小结

(1)一个C程序是从main函数开始执行的,main函数是由操作系统调用的函数

(2)main函数有参数和返回值

(3)现代编译器支持在main函数前(后)调用其它函数

 

以上是关于第33课 main函数与命令行参数的主要内容,如果未能解决你的问题,请参考以下文章

第52课 命令行参数的应用

笨方法学python 33课

第五十二课命令行参数的应用

main主函数参数解析

linux下,在调用main函数之前怎样得到命令行参数argc和argv

CUDA主函数