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”。使用命令列引數時注意以下幾個問題。
(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函式的資料請關注我們其它相關文章!