【C】33. main函数与命令行参数

main 函数的概念

  • C语言中 mian 函数称为主函数
  • 一个C程序是从 main 函数开始的

下面的写法都正确,但是最后一种是标准形式

main()
{}

void main()
{}


int main()
{}


int main()
{
    return 0;
}

思考:

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

这么多种形式也有历史原因,编译器厂商为了商用竞争,更多支持不同形式。同时部分厂商在标准的C标准上右扩展了自己的规范,关键字

main 函数的本质

  • main 函数是操作系统调用的函数
  • 操作系统总是将 main 函数作为应用程序的开始
  • 操作系统将 main 函数的返回值作为程序退出状态

main 函数的返回值实验

在BCC编译环境下实验

补充:

//BCC编译命令
bcc32 file.c

//执行可执行程序(在窗口输入)
file.exe

//显示函数返回值
echo %ERRORLEVEL%
#include <stdio.h>

int main()
{
    printf("I'm A!\n");
    return 0;
}
// 生成 A.exe

#include <stdio.h>

int main()
{
    printf("I'm B!\n");
    return 99;
}
// 生成 B.exe
//命令行执行:
B.exe && A.exe

结果:

分析:

B.exe 返回99,操作系统认为程序没有正常结束,就短路了。

// 执行命令
A.exe && B.exe

结果:

分析:

A.exe 返回0,操作系统认为程序正常结束,就运行下一个程序 B.exe

main 函数的参数

程序执行时可以向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编译器的常见用法

面试中小问题

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

不一定,不同编译器不同的,有些编译器扩张可以在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 0;
}
before_main
main
after_main

在 main 函数之前执行了函数,这是因为GCC编译器扩展了C标准。

小结

  • 一个C程序是从 main 函数开始执行的
  • main 是操作系统调用的函数
  • main 函数有参数和返回值
  • 现代编译器支持在 main 函数前调用其他函数
发布了84 篇原创文章 · 获赞 0 · 访问量 735

猜你喜欢

转载自blog.csdn.net/zhabin0607/article/details/103639724