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

时间:2025-02-26 15:04:20

main函数的概念:

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

测试程序:

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

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

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

main函数的本质:

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

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

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

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

main函数返回值示例程序:

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

在bcc下的返回值如下:

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

两个程序可以连着运行:

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

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

反过来运行结果如下:

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

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

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

main函数的参数:

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

gcc编译器常见用法:

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

示例程序:

 #include <stdio.h>

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

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

运行结果如下:

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

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

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

小技巧:

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

gcc中的属性关键字:

 #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 ;
}

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

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

运行结果如下:

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

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

回答上面的问题:

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

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

小结:

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