C语言进阶:第33课、mian函数与命令行参数

本文详细介绍了C语言中main函数的定义与用法,包括不同形式的main函数原型及其意义,main函数如何接收命令行参数,并展示了如何通过GCC特性实现main函数之前的函数调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言中main函数称为主函数,一个C程序是从main()函数开始执行。

下面的main()函数定义正确吗:


上面四种写法都是正确的!

main()函数是操作系统调用的函数
操作系统总是将main()函数作为应用程序的开始
操作系统将main()函数的返回值作为程序的退出状态(return 0 的原因)

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

return num;

num如果是0以外的其他数字,则会告诉操作系统程序并没有正常进行。(某些情况下会发现短路现象)

程序执行时可以向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编译器的常见用法:
	gcc a.c b.c c.c
argc 	---> 4
argv[0] ---> gcc
argv[1] ---> a.
argv[2] ---> b.c
argv[3] ---> c.c
观察下面代码:
#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("%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;
}

编译运行观察其输出,可以体会main()函数参数的具体含义。

main()函数一定是程序执行的第一个函数吗?(不一定,看编译器了)

#include <stdio.h>

#ifndef __GNUC__
#define __attribute__(x) 
#endif

__attribute__((constructor))   //GCC属性关键字
void before_main()
{
    printf("%s\n",__FUNCTION__);
}

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

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

GCC编译运行:

~/will$ gcc test.c
~/will$ ./a.out
before_main
main
after_main

__attribute__关键字是GCC特有的标准宏。

在BCC下编译同样的代码,会直接报错。但会以其他方式支持在main()函数前运行别的函数?

修改代码如下:

#include <stdio.h>

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

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

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

编译运行会直接执行main()函数。

在不同的编译器中,由不同的扩展,所以代码编写尽量要脱离编译器相关的代码(特殊情况下除外),从而方便移植。在工程中尽量少使用编译器相关的函数。

小结:
一个C程序是从main()函数开始执行
main()函数是操作系统调用的函数
main()函数有参数和返回值。(返回0以外的数字,则程序异常退出)
现代编译器支持在main()函数之前调用其他函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值