Main 函式是 C++ 程式的開頭,所以任何一個可執行的程式均需要定義 Main 函式。main() 主要是負責與 DOS 間的溝通,這可包括接收由 DOS 傳來的命令列參數,和傳回一整數值給 DOS 二部分,分別敘述如下:

⑴ main 的參數

main() 可以選擇性地接收 0 至 3 個參數,下面是這三個參數的意義及使用方式:

main(int argc, char *argv[], char *env[])

① argc:代表由 DOS 傳來的參數數目再加 1,例如在 DOS 下執行 TEST.EXE 程式:

C:> Test aa bb cc 

則 argc 的值爲 4。如果在 DOS 下執行程式時沒傳入任何參數,則 argc 的值爲 1。事實上, argc 是指 argv 內元素的個數。

② argv:內含被執行的全路徑名稱,以及各參數的值。以上例來看:

argv 是一個指位器,它指到一個陣列,而這個陣列內的每一個元素又是字串 (char *) 的指位器,並且最後一個元素的內容爲 NULL 以表結束。由於 DOS 的命令列參數是由 argv[1] 開始放起,所以 argc 的值會是命令列參數的數目再加 1。

③ env:這個參數的型別和 argv 相同,不過它是用來存放 DOS 環境變數的,例如:

main 的 3 個參數必須按順序出現,所以我們不可以將前面的參數省略而保留後面的。以下是 4 種正確的用法:

main()
main(int argc)
main(int argc, char *argv[])
main(int argc, char *argv[], char *env[])

實例:將 DOS 所傳來的參數及其環境變數印出。

#include<iostream.h>

void main(int argc, char *argv[], char *env[])
{
     int i;

     cout << "Total number of DOS arguments is "
          << argc << endl;
     i = 0;
     while(argv[i])                                         // 直到 argv[i] 爲 NULL 爲止
     {
           cout << "argv[" << i << "]:" << argv[i] << endl;
           i++;
     }

     cout << "\nOS Enviroment Variables are :\n";
     i = 0;
     while(env[i])                                          // 直到 env[i] 爲 NULL 爲止
     {
           cout << "env[" << i << "]:" << env[i] << endl;
           i++;
     }
}

執行結果如下:

在 DOS 下輸入:
C:\WORK>test aa bb cc

執行結果:

Total number of DOS arguments is 4
argc[0]: C:\WORK\TEST.EXE
argc[1]: aa
argc[2]: bb
argc[3]: cc

DOS Envirment Variables are :
env[0]: COMSPEC=C:\COMMAND.COM
env[1]: PROMPT=$P$G
env[2]: PATH=C:\DOS;C:\TURBOC4\BIN
env[3]: TEMP=C:\TEMP

☛ 傳回值

main() 也可以 return 一個整數值給 DOS,這個值會被存入 DOS 本身的 ERRORLEVEL 變數中,以供批次檔判斷使用。依 DOS 的慣例,一般傳回 0 表示程式正常結束,而傳回其他的值則表示在執行時有錯誤發生。例如:

int main(int argc, char *argv[])
{
    if(argc < 2)
       return 1;       //表示有錯誤發生
    .....
    return 0;          //正常結束
}

事實上,在 main 函式中使用 return N 就和 exit(N) 的功能是一樣的。如果我們不想傳回任何的值,則 main() 應以 void 宣告。因此, main 函式可有二種型別宣告方式:

int main()           //傳回一整數值
{
    .......
    return n;
}

void main()          //無傳回值
{
     .......
     return;
}