C 語言有兩種可能的執行環境中,它們之間有一定差別:
(1) 獨立環境(freestanding)
在
獨立環境中,C 程式的執行沒有作業系統的支援,因此,只具有最小部分的標準庫能力。
(2) 宿主環境(hosted)
在
宿主環境中,C 程式會在作業系統的控制和支援下執行。可得到完整的標準庫能力。
在獨立環境中,程式開始時所呼叫的第一個函數,其型別和名稱是由正在執行的 C 語言實現版本所決定的。除非是在嵌入式系統上進行 C 程式開發,否則程式一般都執行在宿主環境中。
在宿主環境中編譯的 C 程式必須定義一個名為 main 的函數,這是程式開始時呼叫的第一個函數。main()函數的定義有以下兩種形式:
(1) 函數沒有引數,返回值為 int 型別。
int main( void ) { /* … */ }
(2) 函數有兩個引數,型別分別是 int 和 char**,返回值是 int 型別。
int main( int argc, char *argv[ ] ) { /* … */ }
這兩種定義方式都符合 C 語言標準。除此之外,許多 C 的實現版本還支援第三種、非標準語法的定義方式:
int main( int argc, char *argv[ ], char *envp[ ] ) { /* … */ }
函數返回值是 int,有 3 個引數:第一個是 int,另外兩個是 char**。
在上面所有的例子中,main()函數都會把最終的執行狀態以整數的方式傳遞給作業系統。返回值如果是 0 或 EXIT_SUCCESS,就表示程式執行過程一切順利;任何非 0 的返回值,尤其是 EXIT_FAILURE,則表示程式執行時出現了某種問題。
標頭檔案 stdlib.h 中定義了上述的兩個常數 EXIT_SUCCESS 和 EXIT_FAILURE。
main()函數不一定要有 return 語句。如果程式執行到 main()函數塊的右括號(}),那麼就會自動向執行環境返回狀態值 0。
main()函數結束等效於呼叫標準庫函數 exit(),main()的返回值作為 exit()的引數。
引數 argc 和 argv(也可以根據需要另外命名),代表了程式的命令列引數。它們的作用如下:
(1) argc(全稱為 argument count)的值為 0 或者為命令列中啟動該程式的字串的數量。程式本身的名稱也算作該字串,也要計算進去。
(2) argv(全稱為 arguments vector)是一個 char 指標陣列,每個指標都獨立的指向命令列中每個字串:
陣列中元素的個數,比 argc 的值多 1;最後一個元素 argv[argc] 是空指標。
如果 argc 大於 0,那麼第一個字串,argv[0],就是程式本身的名稱。如果執行環境不支援程式名稱,那麼 argv[0] 為空。
如果 argc 大於 1,從字串 argv[1] 到 argv[argc-1] 包含該程式命令列引數。
(3) envp(全稱為 environment pointer)在非標準的、有 3 個引數的 main()函數版本中,是一個指標陣列,每個指標都指向組成程式環境的一個字串。通常,這個字串的格式是“名稱=值”。在標準 C 語言中,可以利用函數 getenv()獲取得這些環境變數。
例 1 是一個簡單的程式,它輸出自己的名稱以及從作業系統傳入的命令列引數。
【例1】命令列
#include <stdio.h>
int main( int argc, char *argv[ ] )
{
if ( argc == 0 )
puts( "No command line available." );
else
{ // 輸出程式的名稱
printf( "The program now running: %sn", argv[0] );
if ( argc == 1 )
puts( "No arguments received on the command line." );
else
{
puts( "The command-line arguments:" );
for ( int i = 1; i < argc; ++i ) // 將每個引數輸出到不同行
puts( argv[i] );
}
}
}
假設我們在 Unix 系統上執行程式,輸入下面的命令列:
$ ./args one two "and three"
輸出結果如下:
The program now running: ./args
The command-line arguments:
one
two
and three