33-main函数与命令行参数

注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。

测试环境:Ubuntu 10.10

GCC版本:4.4.5

 

一、main函数的概念

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

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

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

A:正确

B:正确

C:正确

D:正确

编程实验
main函数的原型究竟是什么
33-1.c
 
int main()
{
    return 0;
}

二、main函数的本质

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

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

3) 操作系统将main函数的返回值作为程序的退出状态

         思考:

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

很多编译器都存在商业竞争,为了更利于编程,编译器不断优化改善,更灵活的适应编程。

编程实验
main函数的返回值
33-2-A.c
#include <stdio.h>
 
int main()
{
    printf("I'm A!\n");
    return 0;
}

操作:

1) gcc 33-2-A.c -o 33-2-A.out编译正确,打印结果:

I'm A!

 

33-2-B.c
#include <stdio.h>
 
int main()
{
    printf("I'm B!\n");
    return 99;
}

操作:

1) gcc 33-2-B.c -o 33-2-B.out编译正确,打印结果:

I'm B!

2) 如何在gcc下显示main函数返回值。

命令:echo $?
显示:99

 

三、main函数的参数

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

int main()
int main(int argc)
int main(int argc,char *argv[])
int main(int argc,char *argv[],char *env[])
argc-命令行参数个数
argv-命令行参数数组
env-环境变量数组

2)gcc编译器的常见用法:

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

 

实例分析
main函数的参数
33-3.c
#include <stdio.h>
 
int main(int argc, char* argv[], char* env[])
{
    int i = 0;
   
    printf("============== Begin argv ==============\n");
   
    printf("argc = 1");
    
    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;
}

操作:

1) gcc 33-3.c -o 33-3.out编译正确,打印结果:

====== Begin argv ======
argc = 1
./33-3.out
====== End argv ======



======= Begin env ======
====== End env ======

分析:

        命令:./33-3.out  ==> argc = 1 就一个参数:./33-3.out  argv[0] = "./33-3.out"

 

2) 命令:./33-3.out a.c b.c c.c

====== Begin argv ======
argc = 4
./33-3.out
a.c
b.c
c.c
====== End argv ======



======= Begin env ======
====== End env ======

 

四、小技巧

1) 面试中的小问题

         main函数一定是程序执行的第一个函数吗?

不一定。gcc下有属性关键字。

__attribute__((constructor)):main函数之前执行
__attribute__((destructor)):main函数之后执行

 

实例分析
gcc中的属性关键字
33-4.c
 
#include <stdio.h>
 
#ifndef __GNUC__            //如果不是gcc编译器,就定义宏
#define __attribute__(x)
#endif
 
__attribute__((constructor))  // constructor给before_main函数一个属性,提示编译器运行main()先执行defore_main()
void before_main()
{
    printf("%s\n",__FUNCTION__);       //标准的c中__FUNCTION__代表函数名
}
 
__attribute__((destructor))   // destructor给after_main函数一个属性,提示编译器运行完main()函数后执行defore_main()
void after_main()
{
    printf("%s\n",__FUNCTION__);
}
 
int main()
{
    printf("%s\n",__FUNCTION__);
   
    return 0;
}

操作:

1) gcc 33-4.c -o 33-4.out编译正确,打印结果:

before_main
main
after_main

 

小结:

1) 一个C程序是从main函数开始执行的

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

3) main函数有参数返回值

4) 现代编译器支持在main函数前调用其它函数(尽量不要依赖编译器写代码!!)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值