1. 程式人生 > 程式設計 >C++ main函式的幾點細節

C++ main函式的幾點細節

1.main()函式的標準原型

main函式是C++程式的入口函式,C++標準規定main()函式的返回值型別為int,返回值用於表示程式的退出狀態,如果返回0則表示程式正常退出,如果返回非0,則表示出現異常。C++標準規定,main()函式原型有兩種:

int main();

int main(int argc,char* argv[]);
//或
int main(int argc,char** argv);

當main()函式的返回值為int,而函式內沒有出現return語句時,同樣可以通過編譯並正常執行。這是因為編譯器在main()函式的末尾自動添加了return 0;語句。所以,main()函式是C++程式經過特殊處理的函式,其他的返回值型別不是void的函式,如果沒有使用return語句,編譯器將報錯。雖然編譯器會隱式新增return 0;,但還是建議開發人員避免使用這條規則,因為顯示新增可避免出錯時無法返回錯誤碼,並且不會誤認為main()函式可以沒有return語句。

main()函式引數可以用來提供使用者向程式輸入的引數,採用帶參的main()函式原型,int main(int argc,char* argv[]),其中argc代表引數個數,argv陣列中的每一個元素儲存命令列引數內容的字串。考察如下程式。

#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{
 if(argc>1)
 {
 cout<<"Hello "<<argv[1]<<endl; 
 }
 return 0;
}

假設此程式經過編譯之後生成的main.out,那麼在控制檯輸入”main.out LVLV”,會輸出“Hello LVLV”。使用命令列引數時注意以下幾個問題。

(1)命令列輸入的程式名稱為程式的第一個引數,以上程式中argv[0]儲存的是main.out,儘管輸入的只有一個引數”LVLV”,但是引數數量argc包含了程式名稱,因此argc等於2。在其他程式語言(如C#)中,命令列引數並不包含執行檔案的名字。
(2)在命令列中,空格被認為是命令列引數的分隔符,也就是說同一個引數內部不允許出現空格,如果在一個引數中出現空格,可以使用雙引號括起來。如輸入main.out “LVLV and JF”。

2.VC++ mian()函式的返回值可以是任意數值型別

VC++下對main()函式的返回值沒有太嚴格的要求,只要可以強制轉換為int的型別都可以作為返回值,例如char,float,double或者long。參考如下程式。

#include <iostream>
using namespace std;

char main()
{
 cout<<"Hello!"<<endl;
 return '0';
}

以上程式可正常編譯並執行。顯而易見,string是不能作為main函式的返回值。如果將返回型別換成string型別,編譯將報錯,讀者可自行驗證。當然,以上程式碼不具有可移植性,在Linux環境下使用g++編譯不會通過,提示返回值型別必須為int,可見GNU C++更加嚴格的實現了C++標準的內容。

3.Windows平臺可通過環境變數errorlevel獲取main()函式返回值

依據返回值作出不同的響應。編寫如下程式。

#include <iostream>
using namespace std;
int main()
{
 int i;
 cout<<"please input a number"<<endl;
 cin>>i;
 return i;
}

此程式編譯生成main.exe然後編寫一個批處理檔案test.bat,內容如下:

@echo off
main.exe
if %errorlevel%==3 echo third
if %errorlevel%==2 echo second
if %errorlevel%==1 echo first

當我們執行此批處理檔案,從控制檯輸入1,得到first,輸入2,得到second,輸入3,得到third。執行結果如下:

C:\Users\dablelv>test.bat
please input a number
2
second

這個實驗說明了程式main.exe執行時,main()函式的返回值被存放在環境變數errorlevel中,我們可以在批處理檔案中利用這個返回值採用去不同的行動。

在main()函式中,將語句return i;改成函式呼叫exit(i);,這個程式的執行結果不發生變化。exit(i)的執行效果是返回作業系統,並將i作為程式的返回結果。exit用於結束程序,返回程序結束程式碼給作業系統,return用於結束函式呼叫,返回函式結束程式碼給呼叫者。在main()函式中,return和exit均可結束程式,返回結果給作業系統。在C語言程式中,當程式出現無法恢復的錯誤時,就可以使用exit()函式退出程式。但是在C++程式中,exit()函式的使用會破壞程式對物件解構函式的呼叫。在C++程式設計中,應利用異常處理機制來取代對exit()函式的呼叫。

關於批處理檔案的幾點說明。
(1)@符號出現在命令前表示關閉命令回顯,即執行命令時,控制檯不會出現命令的具體內容,只會出現命令的執行結果;
(2)echo off這條命是關閉所有命令回顯,加上@符號表示關閉本條命令回顯;
(3)%a% 這種形式 ,表示對變數a的引用。

4.main()函式不一定是程式中第一個被執行的函式

考察如下程式。

#include <iostream>
using namespace std;
class A
{
public:
 A()
 {
 cout<<"In default A's constructor"<<endl;
 }
};
A b;
int main()
{
 cout<<"In main()"<<endl;
 return 0;
}

編譯執行以上程式碼輸出:

In default A's constructor
In main()

在這個程式中,先輸出“In default A's constructor”,然後輸出的是“In main()”。可見,物件a的建構函式是先於main()函式執行的。實際上,所有外部物件的建構函式都是先於main()函式執行的。如果要對類中的成員物件進行初始化,那麼這些物件的建構函式也是在main()函式之前執行的。如果在這些建構函式中還呼叫了其他函式的話,就可以有更多的函式先於main()函式之前執行。因此main()函式不一定是C++程式的第一個被執行的函式。

以上就是C++ main函式的幾點細節的詳細內容,更多關於C++ main函式的資料請關注我們其它相關文章!