第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函数前(后)调用其它函数

时间: 2024-08-06 16:05:22

第33课 main函数与命令行参数的相关文章

C之main函数和命令行参数(三十)

我们知道在 C 语言中,程序是从 main 函数开始运行的,我们称其为主函数.我们来看看下面几种 main 函数定义正确吗? 那么 main 函数的原型到底是什么呢?我们来看看编译器怎么说,我们分别编译下四种 main 函数的形式,经过编译后,程序可以编译通过并且执行完成.那么最标准的 main 函数的原型是上面的第四种,main 函数是操作系统调用的函数,操作系统总是将 main 函数作为应用程序的开始并且将 main 函数的返回值作为应用程序的退出状态.那么 C 编译器为什么要支持这么多不同

getopt_long函数解析命令行参数

转载:http://blog.csdn.net/hcx25909/article/details/7388750 每一天你都在使用大量的命令行程序,是不是感觉那些命令行参数用起来比较方便,他们都是使用getopt来实现的. 在Linux下使用getopt写程序是一种比较cool的事情,下面来简单的介绍一下getopt的使用. === getopt使用 === 在讨论参数处理之前,我们先明确两个概念:选项.选项参数gcc -g -o test test.c我们经常使用上面的命令来编译程序,这里g和

使用mian函数的命令行参数

使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数"-a"选项执行加法,"-s"选项执行减法,"-m"选项执行乘法,"-d"选项执行除法,后面两个参数为操作数. #include <stdio.h> #include <assert.h> #include <string.h> enum JUDGE                 {  RIGHT,  ERROR

main 函数argc , argv 主命令行参数

ARGc和ARGv中的ARG指的是"参数"(ARGuments, argument counter 和 argument vector ) 至少有两个参数至主函数:ARGc和ARGv: 首先是一个至算提供的参数到程序, 第二个是对字符串数组的指针. 基本作用: argc, argv 用命令行编译程序时有用. 主函数main中变量(int argc, char *argv[ ])的含义 有些编译器允许将main()的返回类型声明为void,这已不再是合法的C++; main(int ar

在命令行上编译本机 C++ 程序以及传递命令行参数给主函数

1.首先,打开"开发人员命令提示" 2.创建一个新目录来保存你的程序. 在"开发人员命令提示"窗口中,输入 cd \ 命令,以将目录更改为驱动器根目录.(md:创建文件夹). 3.在命令提示处,输入 notepad hello.cpp(示例程序.) 4.在命令提示处,输入 cl /EHsc hello.cpp 来编译你的程序. cl.exe 编译器会生成包含已编译代码的 .obj 文件.然后运行链接器来创建名为 hello.exe 的可执行程序 5.若要运行 hel

每日一测1(带命令行参数运行)

怎么让程序带参数运行以便适应不同的测试环境? 命令行参数在程序中的配置位置是在项目-属性-启动选项-命令行参数里 可以通过Main方法传入命令行参数(控制台程序本身就已带), 传入一个string类型的数组.也可以通过System.Environment这个类取出 static void Main(string[] args)  { for (int i = 0; i < args.Length; i++)      //取出来的直接是参数,没有路径 { Console.WriteLine(&quo

main函数——命令行参数与环境变量

main函数,是以C为基础开发平台的程序入口点,通常,我们写程序很少去关注函数main函数参数列表,而是简单给出下面这种情况. int main() {  system("pause");  return 0; } 打开MSDN,查看main函数, main( int argc, char *argv[ ], char *envp[ ] ){program-statements} 首先,我们先来看前两个参数,argc和 argv[ ],这两个主要是用来描述命令行参数的,但并不能说他们是

c/c++ main 函数命令行参数的使用

C程序最大的特点就是所有的程序都是用函数来装配的.main()称之为主函数,是所有程 序运行的入口.其余函数分为有参或无参两种,均由main()函数或其它一般函数调用,若调用的是有参函数,则参数在调用时传递. C/C++语言中的main函数,经常带有参数argc,argv,如下: int main(int argc, char** argv)int main(int argc, char* argv[])从函数参数的形式上看,包含一个整型和一个指针数组.当一个C/C++的源程序经过编译.链接后,

使用getopt函数对命令行短形参进行处理

今天,在看man 9 style时见到了用来处理命令行短形参getopt函数,很是诧异 -- 要知道,我处理命令行参数都是用手动的!于是我如获至宝,赶紧学习学习.getopt的原型被放在unistd.h中,它的原型是这样的:int getopt(int argc, char * const argv[], const char *optstring)这里的argc,argv就是main函数的形参,需要调用是只要把main形参给传过去就ok了.后面的optstring是一个集合,包括了所有可能的短