1. c/c++在main函數之前和之後會做什麼?
底層彙編代碼:
int stack; //初始化棧;
int heap; //初始化堆
open stdin; //打開標準輸入
open stdout; //打開標準輸出
open stder; //打開錯誤流
...
push argv; //把參數argv壓入棧
push argc; //把參數argc壓入棧;
call main; //調用main函數
...
destroy heap; //銷燬內存
close stdin; //關閉標準輸入
close stdout; //關閉標準輸入
close stderr; //關閉錯誤流
...
call __exit;
2. main()函數的參數
c++標準允許主函數main()沒有參數,或有兩個參數。
int main(int argc, char* argv[])
//或者
int main(int argc, char** argv)
argc 表示傳入main函數的參數個數,也可理解爲數組argv的元素個數。
argv表述傳入main函數的指針數組,爲char**類型,也可以爲是一個argv是一個數組,數組中的每一個元素都是一個字符串。
argv的第一個元素argv[0]是程序名稱,並且包含程序的完整路徑。所以,argc至少爲1。
#include "stdafx.h"
#include <gtest\gtest.h>
#include <iostream>
using namespace std;
int main(int number, char* inputParameters[])
{
for (int i = 0; i < number; i++)
{
cout << inputParameters[i] << endl;
}
system("pause");
}
運行結果:
注:一般編譯器默認argc和argv爲main函數的參數,但只要保證第一個參數爲int,第二個爲char**, 符合c++命名規範的變量名都可以作爲main函數的參數。
3. 如何爲main()函數傳遞參數
a. 使用命令行指令
由於main函數不能被其他函數調用,因此不能再程序內部取得實際值,main()函數的參數是從操作系統命令行上獲得的。
上文代碼編譯後可生成可執行文件gtest_example1.exe, 在命令提示符中,鍵入如下命令:可執行文件名 參數1 參數2 參數3 ...
文件名:D:\gtest_example1.exe
參數1:aaa;
參數2: bbb;
b. 使用VS編譯器
在VS編譯器下,右擊工程名,選擇屬性選項, configuration Properties->Debugging->Command Arguments,在右側輸入兩個字符串,“hello” 和“world“ 用空格隔開。但此方法只適用於debug調試時。
4. main()函數的第三個參數
一般情況下,我們用到的main()函數只含有兩個參數,但是查看MSDN,可選的原型爲
int main(int argc, char* argv[], char* envp[])
envp 中存放着系統的環境變量,每一個元素都是key=value 的形式。envp 是以null結束的。下面這段代碼打印出了envp中的所有值。
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[], char* envp[])
{
for (int i = 0; i < argc; i++)
{
cout << argv[i] << endl;
}
for (int i = 0; envp[i] != NULL; i++)
{
cout << envp[i] << endl;
}
system("pause");
}
運行結果:
- UNIX操作系統中普遍擴展了對envp數組的支持;
- 如果使用寬字符,則應該使用wmain代替main,並使用wchar*[] 或者wchar** 類型的envp。可使用tchar.h通用文本編輯。
- envp一旦傳入,他就只是單純的字符串數組而已,不會隨着程序動態設置而改變。 可以使用putenv函數實時的修改環境變量,也可以使用getenv實時查看環境變量,但是envp本身不會發生改變。
- envp的應用舉例: i)如果程序在與運行過程中對環境變量做了修改,在它退出時想要恢復,可以參考envp 中的數據將環境變量恢復到程序執行前的設置。ii) 在程序運行過程中需要參考環境變量再做出決定
參考:https://www.cnblogs.com/jisongxie/p/7892366.html
https://www.cnblogs.com/carsonzhu/p/5276317.html