文章目录

  • 1 main函数的返回值
  • 2 main函数的参数
    • 2.1 main函数的参数的代码案例分析
  • 3 main函数不一定是程序中第一个执行的函数
  • 4 总结

1 main函数的返回值

  • main函数是操作系统调用的函数
  • 操作系统总是将main函数的返回值作为程序的退出状态
  • main函数的返回值正常来说是0,如果是其他值,就是错误的状态。

2 main函数的参数

  • 程序执行的时候可以向main函数传递参数
  • main函数的参数是可变的,可以有多个参数。

那么如何向main函数传参数呢?在gcc编译器下是这样的:

2.1 main函数的参数的代码案例分析

  • 代码 33-3.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; NULL!=env[i]; i++){printf("%s\n", env[i]);}printf("============== End env ==============\n");return 0;
}

首先我们要读懂上述代码。

  • 编译运行后,打印的环境变量有点多(gcc 4.4.5):
  • 运行结果为:

============== Begin argv ==============
./a.out
============== End argv ==============
============== Begin env ==============

ORBIT_SOCKETDIR=/tmp/orbit-delphi SSH_AGENT_PID=1922 TERM=xterm
SHELL=/bin/bash
XDG_SESSION_COOKIE=6c560f89cd4609726ff940b800000007-1551066414.182685-1366729942
WINDOWID=65011749 QTDIR=/usr/local/Trolltech
GNOME_KEYRING_CONTROL=/tmp/keyring-whMMzd
GTK_MODULES=canberra-gtk-module USER=delphi
LD_LIBRARY_PATH=/usr/local/Trolltech/Qt-4.7.4/lib:/usr/local/Trolltech/qtcreator-2.4.1/lib:
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:.tar=01;31:.tgz=01;31:.arj=01;31:.taz=01;31:.lzh=01;31:.lzma=01;31:.tlz=01;31:.txz=01;31:.zip=01;31:.z=01;31:.Z=01;31:.dz=01;31:.gz=01;31:.lz=01;31:.xz=01;31:.bz2=01;31:.bz=01;31:.tbz=01;31:.tbz2=01;31:.tz=01;31:.deb=01;31:.rpm=01;31:.jar=01;31:.rar=01;31:.ace=01;31:.zoo=01;31:.cpio=01;31:.7z=01;31:.rz=01;31:.jpg=01;35:.jpeg=01;35:.gif=01;35:.bmp=01;35:.pbm=01;35:.pgm=01;35:.ppm=01;35:.tga=01;35:.xbm=01;35:.xpm=01;35:.tif=01;35:.tiff=01;35:.png=01;35:.svg=01;35:.svgz=01;35:.mng=01;35:.pcx=01;35:.mov=01;35:.mpg=01;35:.mpeg=01;35:.m2v=01;35:.mkv=01;35:.ogm=01;35:.mp4=01;35:.m4v=01;35:.mp4v=01;35:.vob=01;35:.qt=01;35:.nuv=01;35:.wmv=01;35:.asf=01;35:.rm=01;35:.rmvb=01;35:.flc=01;35:.avi=01;35:.fli=01;35:.flv=01;35:.gl=01;35:.dl=01;35:.xcf=01;35:.xwd=01;35:.yuv=01;35:.cgm=01;35:.emf=01;35:.axv=01;35:.anx=01;35:.ogv=01;35:.ogx=01;35:.aac=00;36:.au=00;36:.flac=00;36:.mid=00;36:.midi=00;36:.mka=00;36:.mp3=00;36:.mpc=00;36:.ogg=00;36:.ra=00;36:.wav=00;36:.axa=00;36:.oga=00;36:.spx=00;36:.xspf=00;36:
SSH_AUTH_SOCK=/tmp/keyring-whMMzd/ssh
DEFAULTS_PATH=/usr/share/gconf/gnome.default.path
SESSION_MANAGER=local/delphi-vm:@/tmp/.ICE-unix/1891,unix/delphi-vm:/tmp/.ICE-unix/1891
USERNAME=delphi XDG_CONFIG_DIRS=/etc/xdg/xdg-gnome:/etc/xdg
DESKTOP_SESSION=gnome LIBGL_ALWAYS_INDIRECT=1
PATH=/usr/local/Trolltech/Qt-4.7.4/bin:/usr/local/Trolltech/qtcreator-2.4.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
QT_IM_MODULE=xim PWD=/home/delphi/c XMODIFIERS=@im=ibus
GDM_KEYBOARD_LAYOUT=cn LANG=zh_CN.utf8 GNOME_KEYRING_PID=1872
MANDATORY_PATH=/usr/share/gconf/gnome.mandatory.path
GDM_LANG=zh_CN.utf8 GDMSESSION=gnome SHLVL=1 HOME=/home/delphi
LANGUAGE=zh_CN:zh GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=delphi
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-G9nxTNqahq,guid=1897c64e05f77bfe7d13058e00000f3e
XDG_DATA_DIRS=/usr/share/gnome:/usr/local/share/:/usr/share/
LESSOPEN=| /usr/bin/lesspipe %s WINDOWPATH=7 DISPLAY=:0.0
GTK_IM_MODULE=ibus LESSCLOSE=/usr/bin/lesspipe %s %s
XAUTHORITY=/var/run/gdm/auth-for-delphi-ZsN9VV/database
COLORTERM=gnome-terminal
_=./a.out OLDPWD=/home/delphi
============== End env ==============

  • 虽然上面打印的消息比较多,但是结构很清晰。我们不过多的研究打印的消息,而是关心代码是怎么样写的。

3 main函数不一定是程序中第一个执行的函数

对于gcc编译器来说,它有一些属性关键字。可以利用这些属性关键字来构造先与main函数执行的函数,或者构造出main函数执行后执行的函数。

直接用代码说明问题会比较好:

  • 代码33-4.c
#include <stdio.h>#ifndef __GNUC__               //判断是否是GNUC编译器
#define __attribute__(x)
#endif__attribute__((constructor))  //gcc属性关键字
void before_main()
{printf("%s\n",__FUNCTION__);
}__attribute__((destructor))  //gcc属性关键字
void after_main()
{printf("%s\n",__FUNCTION__);
}int main(){printf("%s\n","main");return 0;
}
  • 运行结果如下:

可以看出:

  • 使用gcc属性关键字可以构造先与main函数执行的函数
  • 也可以构造出在main函数执行之后执行的函数
  • 但是这种属性是依赖于编译器的,将上述代码拿到Windows的编译器运行可能就不对。所以一般不使用编译器的属性关键字
  • 上述代码的宏定义部分是判断当前是否是GNUC编译器。不是的话,就不支持该属性,直接顶一个一个空的宏__attribute__(x) ,它在后面的代码中也就没有意义了。

4 总结

  • main函数是操作系统调用的函数
  • 现代编译器支持在main函数前调用其他函数
  • 注意main函数的参数

【C语言进阶深度学习记录】二十九 main函数与命令行参数相关推荐

  1. 【C语言进阶深度学习记录】十九 #pragma使用与分析

    文章目录 1 #pragma 概念简介 1.1 #pragma message 的用法 1.2 #pragma once 的用法 1.3 #pragma pack 的用法 1.31 struct占用的 ...

  2. 【C语言进阶深度学习记录】十六 静态库与动态库的创建与使用

    上一篇文章学习了编译的过程,点击链接查看:[C语言进阶深度学习记录]十五 编译过程简介,每一个C源文件编译后将会生成目标文件,那么这些目标文件,还需要链接起来,生成可执行文件. 文章目录 1 链接的意 ...

  3. 【C语言进阶深度学习记录】十二 C语言中的:字符和字符串

    文章目录 1 C语言中的单引号和双引号 1.1 双引号带来的BUG 2 总结 1 C语言中的单引号和双引号 C语言中的单引号用来表示字符字面量 C语言中的双引号用来表示字符串字面量,存储于全局的只读存 ...

  4. 【C语言进阶深度学习记录】十五 编译过程简介

    文章目录 1 初识编译器 2 总结 1 初识编译器 我们平时口中所说的编译器,是广泛的编译器.实际上,编译器包括了以下四个部分: 一个C代码被编译为可执行代码,包括以下几个过程: 下面就对上述的各个过 ...

  5. 【C语言进阶深度学习记录】十四 C语言中 三目运算符和逗号表达式

    文章目录 1 三目运算符 1.1 三目运算符的返回类型的代码案例分析 2 逗号表达式 2.1 逗号表达式代码案例分析 2.2 如何用一行代码实现 strlen函数 3 总结 1 三目运算符 三目运算符 ...

  6. 【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析

    本文并不讲C语言的基础 文章目录 1 空struct的大小 2 结构体与柔性数组 2.1 柔性数组的使用方法 2.2 柔性数组使用代码案例分析 3 C语言中的union分析 3.1 使用union判断 ...

  7. 【C语言进阶深度学习记录】十八 条件编译的使用与分析

    文章目录 1 基本概念 1.1 代码分析 1.2 通过命令行定义宏 2 #include 的本质 2.1 解决重复包含头文件的问题 3 条件编译的应用 4 总结 1 基本概念 条件编译的行为类似于C语 ...

  8. 【C语言进阶深度学习记录】二十六 C语言中的字符串与字符数组的详细分析

    之前有一篇文章是学习了字符和字符串的,可以与之结合学习:[C语言进阶深度学习记录]十二 C语言中的:字符和字符串 文章目录 1 字符串的概念 1.1 字符串与字符数组 1.2 字符数组与字符串代码分析 ...

  9. 【C语言进阶深度学习记录】三十五 程序中的堆、栈以及静态存储区(数据区)

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 在我之前学习底层的知识的时候,也写过相关的内容.可以对比的学习:[软 ...

最新文章

  1. oracle 里 符号 || 表示什么意思??
  2. 理解大型分布式网站你应该知道这些概念
  3. 安卓后端mysql_后端Spring Boot+前端Android交互+MySQL增删查改(Java+Kotlin实现)
  4. 【安全漏洞】黑客利用IE 0 day漏洞部署VBA恶意软件
  5. 吉首大学2019年程序设计竞赛
  6. Saltstack-6:模块
  7. rc mysql common_RR与RC隔离级别下MySQL不同的加锁解锁方式
  8. url 加密解密, email 加密
  9. [再学Python] - 面向对象的程序设计- 对象和类
  10. 刮刮乐html5效果擦除,HTML5实现刮刮卡的效果
  11. 大数据处理与分析---课程总结
  12. java基本的商品管理系统
  13. 四大行、三大运营商在列,或有15家公司参与央行数字货币
  14. 鲍斯科机器人_芜湖鲍斯柯机器人有限公司、上海富治机械科技有限公司服务合同纠纷二审民事判决书...
  15. MVC模式初体验 properties解析工具 与 Dao层的结合 —————— 开开开山怪
  16. 酷睿i5 1240p什么水平 i5 1240p参数 i51240p是标压还是低压
  17. Unity教程之-Unity游戏技能Skill系统架构设计
  18. 如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048。//现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等
  19. 使用python和PyQt5编写爬取百度图片的界面工具
  20. 乘“云原生”之风、踏“数字化”的浪,《新程序员003》开启预售

热门文章

  1. tomcat:Cannot find /usr/local/tomcat1/bin/setclasspath.sh
  2. Linux 多线程开发-线程创建pthread_creat
  3. javaScript高程笔记--最佳实践
  4. JS 构造图片Image对象
  5. SAP RFC 获取BDC 消息文本的实现
  6. vim下php文件中自动缩排html代码
  7. MSSQL如何在没有主键的表中删除重复数据
  8. MVC + LigerUI 做后台管理还真是清爽
  9. 在网上找到一个CSS hack列表,记录在这里以分析css的浏览器兼容性
  10. javascript 获取上一页的url