?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
每個(gè)C程序編碼在托管執(zhí)行環(huán)境中運(yùn)行都包含被調(diào)用函數(shù)的定義(不是原型),該函數(shù)main
是程序的指定開(kāi)始。
int main (void) { body } | (1) | |
---|---|---|
int main (int argc, char *argv[]) { body } | (2) | |
int main (int argc, char *argv[] , other_parameters ) { body } | (3) | |
/* another implementation-defined signature */ | (4) |
ARGC | - | 非負(fù)值,表示從運(yùn)行程序的環(huán)境傳遞給程序的參數(shù)數(shù)量。 |
---|---|---|
ARGV | - | 指向由空字符結(jié)尾的多字節(jié)字符串組成的指針數(shù)組,這些字符串表示從執(zhí)行環(huán)境(argv0到argvargc-1)傳遞給程序的參數(shù)。argvargc的值保證為0。 |
body | - | 主要功能的主體 |
other_parameters | - | 實(shí)現(xiàn)可能允許主函數(shù)的其他形式。一個(gè)非常常見(jiàn)的擴(kuò)展是傳遞char * []類(lèi)型的第三個(gè)參數(shù),指向執(zhí)行環(huán)境變量的指針數(shù)組。 |
名稱(chēng)argc
和argv
是任意的,以及參數(shù)類(lèi)型的表示:int main(int ac, char** av)
是同樣有效。
如果使用return語(yǔ)句,則返回值將用作隱式調(diào)用的參數(shù)exit()
(請(qǐng)參閱下面的詳細(xì)信息)。值為零并EXIT_SUCCESS
表示終止成功,該值EXIT_FAILURE
表示不成功終止。
main
在所有具有靜態(tài)存儲(chǔ)持續(xù)時(shí)間的對(duì)象被初始化之后,程序啟動(dòng)時(shí)會(huì)調(diào)用該函數(shù)。它是在托管環(huán)境(即操作系統(tǒng))中執(zhí)行的程序的指定入口點(diǎn)。任何獨(dú)立程序(引導(dǎo)加載程序,操作系統(tǒng)內(nèi)核等)的入口點(diǎn)的名稱(chēng)和類(lèi)型都是實(shí)現(xiàn)定義的。
主函數(shù)的雙參數(shù)形式的參數(shù)允許從執(zhí)行環(huán)境傳遞任意多字節(jié)字符串(這些通常稱(chēng)為命令行參數(shù))。指針argv[1] .. argv[argc-1]
指向每個(gè)字符串中的第一個(gè)字符。argv[0]
是一個(gè)指向空字符結(jié)尾多字節(jié)字符串的初始字符的指針,它表示用于調(diào)用程序本身的名稱(chēng)(或者,如果執(zhí)行環(huán)境不支持它,argv0保證為零)。
如果執(zhí)行環(huán)境無(wú)法區(qū)分大寫(xiě)字母和小寫(xiě)字母,則命令行參數(shù)會(huì)轉(zhuǎn)換為小寫(xiě)字母。
這些字符串是可修改的,任何修改都會(huì)一直存在,直到程序終止,盡管這些修改不會(huì)傳播回執(zhí)行環(huán)境:例如,可以使用它們strtok
。
所指向的數(shù)組的大小argv
至少為argc+1
,最后一個(gè)元素argv[argc]
保證為空指針。
main
函數(shù)有幾個(gè)特殊的屬性:
1)該功能的原型不能由程序提供
2)如果主函數(shù)的返回類(lèi)型與之兼容int
,那么從初始調(diào)用返回到main(但不是從任何后續(xù)遞歸調(diào)用返回)相當(dāng)于執(zhí)行該exit
函數(shù),其值為主函數(shù)作為參數(shù)返回傳遞(然后調(diào)用注冊(cè)的函數(shù)atexit
,刷新并關(guān)閉所有流,并刪除創(chuàng)建的文件tmpfile
,并將控制權(quán)返回給執(zhí)行環(huán)境)。
3)如果主函數(shù)的返回類(lèi)型與int
(eg void main(void)
)不兼容,則返回到執(zhí)行環(huán)境的值未指定
4)main函數(shù)的主體不需要包含返回語(yǔ)句:如果控制到達(dá)main
沒(méi)有遇到return語(yǔ)句的結(jié)尾,效果就是執(zhí)行return 0;
。
演示如何通知程序哪里可以找到它的輸入以及在哪里編寫(xiě)結(jié)果。
Invocation: ./a.out indatafile outdatafile.
#include <stdio.h> int main(int argc, char *argv[]){ printf("argc = %d\n", argc); int ndx = 0; while (ndx < argc) { printf("argv[%d] --> %s\n", ndx,argv[ndx]); ++ndx; } printf("argv[argc] = %s\n", argv[argc]); return 0;}
可能的輸出:
argc = 3argv[0] --> ./a.out argv[1] --> indatafile argv[2] --> outdatafile argv[argc] = (null)
C11 standard (ISO/IEC 9899:2011):
5.1.2.2.1 Program startup (p: 13)
C99 standard (ISO/IEC 9899:1999):
5.1.2.2.1 Program startup (p: 12)
C89/C90 standard (ISO/IEC 9899:1990):
2.1.2.2 Hosted environment