c/c++語言中的main函式, 經常帶有引數argc, argv, 如下:
int main(int argc, char** argv)
int main(int argc, char* argv) //也可以是wchar_t 或 tchar
argc 是指命令列輸入引數的個數, argv儲存了所有的命令列引數. 在命令列下, 每兩個argv[n]之間以空格分隔.
如在命令列下輸入 test.exe a b
argc 為 3
argv[0] 為 "test.exe"
argv[1] 為 "a"
argv[2] 為 "b"
以下乙個簡單的程式可以幫你看看argc, argv具體代表什麼.
#include
int main(int argc, char* argv)
return 0;
}另外, vc環境下向程式傳遞引數可以在 debugging -> command argument 下設定. (下面說的winmain也一樣)
在vs2008下,右鍵要除錯的專案—>properties—>debugging—>command arguments—>輸入你要輸入的引數即可。
winmain函式的原型宣告如下:
int winapi winmain(
hinstance hinstance, // handle to current instance
hinstance hprevinstance, // handle to previous instance
lpstr lpcmdline, // command line
int ncmdshow // show state
);winmain函式接收4個引數, 這些引數都是在系統呼叫winmain函式時, 傳遞給應用程式的.
第乙個引數hinstance表示該程式當前執行的例項的控制代碼, 這是乙個數值. 當程式在windows下執行時, 它唯一標識執行中的例項(注意, 只有執行中的程式例項, 才有例項控制代碼). 乙個應用程式可以執行多個例項, 每執行乙個例項, 系統都會給該例項分配乙個控制代碼值, 並通過hinstance引數傳遞給winmain函式.
第二個引數hprevinstance (msdn)在win32環境下, 這個引數不起作用,歷史遺留,hprevinstance=null;
第三個引數lpcmdline是乙個以空('\0')終止的字串, 指定傳遞給應用程式的命令列引數.
注: 執行引數,例如在命令列鍵入:test.exe /install,那麼程式入口winmain處,其引數lpcmdline就接收到了/install引數。但是,至於你用這個引數做什麼,那是用**實現,你即時對/install引數做了乙個"uninstall"的處理,也是可以的。而實現安裝,這需要根據你的需求加入**,和命令列引數無關。
這個跟命令列的int main(int argc, char* argv)不同
如上文test.exe a b
lpcmdline 為 "a b"
第四個引數ncmdshow指定程式的視窗應該如何顯示, 例如最大化、最小化、隱藏等. 這個引數的值由該程式的呼叫者所指定, 應用程式通常不需要去理會這個引數的值.
注意:c語言的windows api程式設計,並不一定需要使用winmain入口函式。
如果不使用winmain的四個引數,那麼直接使用main代替winmain就完全可以了。
如果程式中使用了winmanin的某個引數,那麼也可以用main替代,但是需要增加winmain的四個引數作為變數,如下所示:
main()
不過有一點要說明的就是getcommandline()函式返回的命令列引數帶有執行程式本身的名字,而winmain的引數lpstr lpcmdline是不包含執行程式的名字本身的。
用main代替winmain除了命令列引數是否包含程式本身名字這一點外,其他未發現不同。
測試一下,就用乙個最簡單程式:
winmain版:
因為winmain
的cmdline
不包含程式名,所以就什麼也沒有顯示。
main版:
用main
代替winmain
除了命令列引數是否包含程式本身名字這一點外,其他未發現不同。
測試了《
windows
程式設計第五版》中的幾個程式,都可以正常執行。
最後補充說明:對於
icmdshow
還可以不在程式中指定,由系統輸入獲得:
startupinfo startupinfo;
memset(&startupinfo,0,sizeof(startupinfo));
getstartupinfo(&startupinfo);
icmdshow = (int)startupinfo.wshowwindow;//
獲取視窗顯示模式
另外為了獲得更準確的
cmdline
,可以自編乙個函式,不過我自編的這個函式,會去掉命令列中多餘的空格:
//用這個函式可以返回去掉了多餘空格的
szcmdline
lptstr getcmdline(int argc,char *argv)
{int i=0;
int length=0;
char * cmdline;
if(argc<2)
return text("");
for(i=1; i2)
{for(i=2;i
main函式入口
最近在弄boost test單元測試的時候,遇到了乙個執行程式後就閃退掉的問題,找了好久才發現,原來是沒有進入到boost 自己的main函式中,因為鏈結的其他lib中,有乙個檔案也定義了main函式,編輯器最終是選擇了那個main函式作為程式的入口。在vs下 main函式 通常是 int tmai...
python入口函式
在乙個.py檔案中,如果不是在定義函式,也就是說不是在def關鍵字的內嵌結構內,python會預設其餘部分函式是main函式,並自動執行,但正規工程中,一般都會將main函式寫為 if name main 每個人都在寫,但很少有人問,其實這個用法很巧妙!1 2 3 4 5 6 7 8 hello.p...
jQuery 入口函式
載入模式 js和jquery的區別title 原生js 函式覆蓋問題 js window.onload function ev window.onload function 輸出結果 彈出 hello twojs jquery document ready function document rea...