?
Dieses Dokument verwendet PHP-Handbuch für chinesische Websites Freigeben
每個C程序編碼在托管執(zhí)行環(huán)境中運行都包含被調(diào)用函數(shù)的定義(不是原型),該函數(shù)main
是程序的指定開始。
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 | - | 非負值,表示從運行程序的環(huán)境傳遞給程序的參數(shù)數(shù)量。 |
---|---|---|
ARGV | - | 指向由空字符結(jié)尾的多字節(jié)字符串組成的指針數(shù)組,這些字符串表示從執(zhí)行環(huán)境(argv0到argvargc-1)傳遞給程序的參數(shù)。argvargc的值保證為0。 |
body | - | 主要功能的主體 |
other_parameters | - | 實現(xiàn)可能允許主函數(shù)的其他形式。一個非常常見的擴展是傳遞char * []類型的第三個參數(shù),指向執(zhí)行環(huán)境變量的指針數(shù)組。 |
名稱argc
和argv
是任意的,以及參數(shù)類型的表示:int main(int ac, char** av)
是同樣有效。
如果使用return語句,則返回值將用作隱式調(diào)用的參數(shù)exit()
(請參閱下面的詳細信息)。值為零并EXIT_SUCCESS
表示終止成功,該值EXIT_FAILURE
表示不成功終止。
main
在所有具有靜態(tài)存儲持續(xù)時間的對象被初始化之后,程序啟動時會調(diào)用該函數(shù)。它是在托管環(huán)境(即操作系統(tǒng))中執(zhí)行的程序的指定入口點。任何獨立程序(引導加載程序,操作系統(tǒng)內(nèi)核等)的入口點的名稱和類型都是實現(xiàn)定義的。
主函數(shù)的雙參數(shù)形式的參數(shù)允許從執(zhí)行環(huán)境傳遞任意多字節(jié)字符串(這些通常稱為命令行參數(shù))。指針argv[1] .. argv[argc-1]
指向每個字符串中的第一個字符。argv[0]
是一個指向空字符結(jié)尾多字節(jié)字符串的初始字符的指針,它表示用于調(diào)用程序本身的名稱(或者,如果執(zhí)行環(huán)境不支持它,argv0保證為零)。
如果執(zhí)行環(huán)境無法區(qū)分大寫字母和小寫字母,則命令行參數(shù)會轉(zhuǎn)換為小寫字母。
這些字符串是可修改的,任何修改都會一直存在,直到程序終止,盡管這些修改不會傳播回執(zhí)行環(huán)境:例如,可以使用它們strtok
。
所指向的數(shù)組的大小argv
至少為argc+1
,最后一個元素argv[argc]
保證為空指針。
main
函數(shù)有幾個特殊的屬性:
1)該功能的原型不能由程序提供
2)如果主函數(shù)的返回類型與之兼容int
,那么從初始調(diào)用返回到main(但不是從任何后續(xù)遞歸調(diào)用返回)相當于執(zhí)行該exit
函數(shù),其值為主函數(shù)作為參數(shù)返回傳遞(然后調(diào)用注冊的函數(shù)atexit
,刷新并關(guān)閉所有流,并刪除創(chuàng)建的文件tmpfile
,并將控制權(quán)返回給執(zhí)行環(huán)境)。
3)如果主函數(shù)的返回類型與int
(eg void main(void)
)不兼容,則返回到執(zhí)行環(huán)境的值未指定
4)main函數(shù)的主體不需要包含返回語句:如果控制到達main
沒有遇到return語句的結(jié)尾,效果就是執(zhí)行return 0;
。
演示如何通知程序哪里可以找到它的輸入以及在哪里編寫結(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