main函数第3个参数envp装的是什么(envp:环境变量)
1.引入
?一般情況下,main函數帶有兩個參數,分別為int argc和char* argv[],各自表示參數個數、參數選項。比如在cmd窗口中運行ping www.csdn.net -t,那么傳到ping程序的main函數的兩個參數argc=3,argv[]={"ping","www.csdn.net","-t"}。
查看MSDN,可選的原型為int main(intargc,char*argv[],char*envp[]);。前兩個參數比較熟悉,第3個參數就很陌生了。那么,envp裝的是什么,有什么用?
2.打印環境變量
編寫一個小程序,把envp里的數據打印出來,代碼如下:
其結果為:
0:ALLUSERSPROFILE=C:\ProgramData
1:APPDATA=C:\Users\root\AppData\Roaming
2:asl.log=Destination=file
3:CommonProgramFiles=C:\Program Files\Common Files
4:COMPUTERNAME=ROOT-PC
5:ComSpec=C:\Windows\system32\cmd.exe
6:DXSDK_DIR=C:\Program Files\Microsoft DirectX SDK (June 2010)\
7:FP_NO_HOST_CHECK=NO
8:HOMEDRIVE=C:
9:HOMEPATH=\Users\root
10:LOCALAPPDATA=C:\Users\root\AppData\Local
11:LOGONSERVER=\\ROOT-PC
12:MOZ_PLUGIN_PATH=C:\Program Files\Foxit Software\Foxit Reader\plugins\
13:NUMBER_OF_PROCESSORS=4
14:OS=Windows_NT
15:PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
16:PROCESSOR_ARCHITECTURE=x86
17:PROCESSOR_IDENTIFIER=x86 Family 6 Model 15 Stepping 11, GenuineIntel
18:PROCESSOR_LEVEL=6
19:PROCESSOR_REVISION=0f0b
20:ProgramData=C:\ProgramData
21:ProgramFiles=C:\Program Files
22:PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
23:PUBLIC=C:\Users\Public
24:SESSIONNAME=Console
25:SystemDrive=C:
26:SystemRoot=C:\Windows
27:TEMP=C:\Users\root\AppData\Local\Temp
28:TMP=C:\Users\root\AppData\Local\Temp
29:USERDOMAIN=root-PC
30:USERNAME=root
31:USERPROFILE=C:\Users\root
32:VisualStudioDir=C:\Users\root\Documents\Visual Studio 2010
33:VS100COMNTOOLS=D:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools\
34:windir=C:\Windows
35:PATH=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Program Files
\Common Files\Thunder Network\KanKan\Codecs;D:\Program Files\Microsoft Visual St
udio 10.0\;D:\Program Files\Microsoft Visual Studio 10.0\VC\bin
請按任意鍵繼續. . .
觀察結果不難發現,envp里存放正是系統的環境變量,可以右鍵單擊計算機->屬性->高級系統設置->環境變量(Win7),打開環境變量設置窗口,如圖1所示。
??????????????????????????????????? 圖1 系統環境變量設置窗口
把圖1所示窗口中的變量名稱、值與程序打印出來的結果對比,它們是一樣的。也就是說envp數組里保存的正式系統的環境變量。
3.envp的用途
MSDN上的解釋是這樣的:
Microsoft Specific
wmain( int argc, wchar_t *argv[ ], wchar_t *envp[ ] )
envp:
The envp array, which is a common extension in many UNIX? systems【#1】, is used in Microsoft C++. It is an array of strings representing the variables set in the user's environment. This array is terminated by a NULL entry【#2】. It can be declared as an array of pointers to char (char *envp[ ]) or as a pointer to pointers to char (char **envp). If your program uses wmain instead of main, use thewchar_t data type instead ofchar【#3】. The environment block passed to main and wmain is a "frozen" copy of the current environment【#4】. If you subsequently change the environment via a call to putenv or _wputenv, the current environment (as returned by getenv/_wgetenv and the _environ/ _wenviron variable) will change, but the block pointed to by envp will not change. See Customizing Command Line Processing for information on suppressing environment processing. This argument is ANSI compatible in C, but not in C++【#5】.
#1:許多UNIX操作系統中普遍擴展了對envp數組的支持;
#2:它保存這用戶環境中的變量字符串,以NULL結束。正因此,本文上面的例子用if(envp[i])來判斷是否打印完畢;
#3:envp可以是char*[]類型也可以是char**類型,本文上面的例子使用的是前者;如果使用寬字符集,則應使用wmain代替main,并使用wchar*[]或wchar**類型的envp。本文上面的例子使用tchar.h,使用了通用文本編程;
#4:envp一旦傳入,它就只是單純的字符串數組而已,不會隨著程序動態設置發生改變。可以使用putenv函數實時修改環境變量,也能使用getenv實時查看環境變量,但是envp本身不會發生改變;
#5:這個版本對ANSI C兼容,但對ANSI C++不兼容。
envp用的不多,因此對它的作用并沒有argc和argv那樣清楚的理解。不過依據它的表現,筆者能夠想到的到envp的作用有兩點:
(1)為程序提供參考:程序的運行過程中需要參考環境變量作出決定,比如安裝程序必須知道系統默認的ProgramFiles,它可以通過envp查看到本系統的程序文件夾在ProgramFiles=C:\Program Files,于是默認安裝目錄就設置定為C:\ProogramFiles;
(2)如果程序在運行過程中對環境變量做了修改,在它退出時想要恢復,這時就可以參照envp中的數據將環境變量恢復到程序執行前的設置。
附:
由于main函數不能被其它函數調用, 因此不可能在程序內部取得實際值。那么,在何處把實參值賦予main函數的形參呢? 實際上,main函數的參數值是從操作系統命令行上獲得的。當我們要運行一個可執行文件時,在命令行鍵入文件名,再輸入實際參數即可把這些實參傳送到main的形參中去。
命令行下運行可執行文件的一般形式為:可執行文件名 參數 參數……,命令行中的參數個數原則上未加限制。argc參數表示了命令行中參數的個數(注意:文件名本身也算一個參數),argc的值是在輸入命令行時由系統按實際參數的個數自動賦予的。例如有命令行為./a.out a b b d a,由于文件名a.out本身也算一個參數,所以共有6個參數,因此argc取得的值為6。argv參數是字符串指針數組,其各元素值為命令行中各字符串(參數均按字符串處理)的首地址。 指針數組的長度即為參數個數。數組元素初值由系統自動賦予。
總結
以上是生活随笔為你收集整理的main函数第3个参数envp装的是什么(envp:环境变量)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux中makefile项目管理
- 下一篇: main函数的参数详解,它们是何时何处传