【C语言进阶深度学习记录】二十九 main函数与命令行参数
文章目錄
- 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
首先我們要讀懂上述代碼。
- 編譯運行后,打印的環境變量有點多(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
- 運行結果如下:
可以看出:
- 使用gcc屬性關鍵字可以構造先與main函數執行的函數
- 也可以構造出在main函數執行之后執行的函數
- 但是這種屬性是依賴于編譯器的,將上述代碼拿到Windows的編譯器運行可能就不對。所以一般不使用編譯器的屬性關鍵字
- 上述代碼的宏定義部分是判斷當前是否是GNUC編譯器。不是的話,就不支持該屬性,直接頂一個一個空的宏__attribute__(x) ,它在后面的代碼中也就沒有意義了。
4 總結
- main函數是操作系統調用的函數
- 現代編譯器支持在main函數前調用其他函數
- 注意main函數的參數
總結
以上是生活随笔為你收集整理的【C语言进阶深度学习记录】二十九 main函数与命令行参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++读取文件–结束条件的判断
- 下一篇: 梳理百年深度学习发展史-七月在线机器学习