[英]Significance of argc and argv in int main( int argc, char** argv ) in OpenCV
[英]What does int argc, char *argv[] mean?
在許多 C++ IDE 和編譯器中,當它為您生成主要的 function 時,它看起來像這樣:
int main(int argc, char *argv[])
當我在沒有 IDE 的情況下編寫 C++ 時,僅使用命令行編譯器,我輸入:
int main()
沒有任何參數。 這是什么意思,對我的計划至關重要嗎?
argv
和argc
是命令行參數在 C 和 C++ 中傳遞給main()
的方式。
argc
將是argv
指向的字符串數。 這將(實際上)是 1 加上參數的數量,因為幾乎所有的實現都會將程序的名稱添加到數組中。
變量按約定命名為argc
(參數計數)和argv
(參數向量),但可以為它們指定任何有效標識符: int main(int num_args, char** arg_strings)
同樣有效。
如果您不打算處理命令行參數,它們也可以完全省略,產生int main()
。
試試下面的程序:
#include <iostream>
int main(int argc, char** argv) {
std::cout << "Have " << argc << " arguments:" << std::endl;
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
}
使用./test a1 b2 c3
運行它會輸出
Have 4 arguments:
./test
a1
b2
c3
argc
是從命令行傳遞到程序中的參數數量,而argv
是參數數組。
您可以遍歷參數,知道它們的數量,例如:
for(int i = 0; i < argc; i++)
{
// argv[i] is the argument at index i
}
假設您這樣運行程序(使用sh
語法):
myprog arg1 arg2 'arg 3'
如果您將 main 聲明為int main(int argc, char *argv[])
,那么(在大多數環境中),您的main()
將被稱為:
p = { "myprog", "arg1", "arg2", "arg 3", NULL };
exit(main(4, p));
但是,如果您將 main 聲明為int main()
,它將被稱為類似
exit(main());
你沒有得到通過的論點。
還有兩點需要注意:
main
僅有的兩個標准強制簽名。 如果特定平台接受額外的參數或不同的返回類型,那么這是一個擴展,不應該在可移植程序中依賴。*argv[]
和**argv
完全等價,因此您可以將int main(int argc, char *argv[])
寫為int main(int argc, char **argv)
。int main();
這是一個簡單的聲明。 它不能接受任何命令行參數。
int main(int argc, char* argv[]);
當您的程序必須采用命令行參數時使用此聲明。 像這樣運行時:
myprogram arg1 arg2 arg3
argc
或 Argument Count 將設置為 4(四個參數),並且argv
或 Argument Vectors 將填充指向“myprogram”、“arg1”、“arg2”和“arg3”的字符串指針。 程序調用( myprogram
)包含在參數中!
或者,您可以使用:
int main(int argc, char** argv);
這也是有效的。
您可以添加另一個參數:
int main (int argc, char *argv[], char *envp[])
envp
參數還包含環境變量。 每個條目都遵循以下格式:
VARIABLENAME=VariableValue
像這樣:
SHELL=/bin/bash
環境變量列表以空值結尾。
重要提示:不要在調用system()
時直接使用任何argv
或envp
值! 這是一個巨大的安全漏洞,因為惡意用戶可以將環境變量設置為命令行命令並(可能)造成巨大破壞。 一般來說,不要使用system()
。 幾乎總是有通過 C 庫實現的更好的解決方案。
main
的參數表示程序啟動時提供給程序的命令行參數。 argc
參數表示命令行參數的數量, char *argv[]
是一個字符串數組(字符指針),表示命令行上提供的各個參數。
main
函數可以有兩個參數, argc
和argv
。 argc
是一個整數 ( int
) 參數,它是傳遞給程序的參數數量。
程序名稱始終是第一個參數,因此程序至少有一個參數,而argc
的最小值將是一個。 但是如果一個程序本身有兩個參數,則argc
的值將是三個。
參數argv
指向一個字符串數組,稱為參數向量。 它是函數參數的一維字符串數組。
第一個參數是提供的參數數量,第二個參數是表示這些參數的字符串列表。
讓我們考慮一下聲明:
int main (int argc, char *argv[])
在上面的聲明中,名為argv
的第二個參數的類型實際上是一個char**
。 也就是說, argv
是一個指向char
的指針。 這是因為char* []
由於類型衰減而衰減為char**
。 例如,下面給出的聲明是等價的:
int main (int argc, char *argv[]); //first declaration
int main (int argc, char **argv); //RE-DECLARATION. Equivalent to the above declaration
換句話說, argv
是一個指針,它指向具有char*
類型元素的數組的第一個元素。 此外,數組的每個元素argv[i]
(具有char*
類型的元素)本身都指向一個字符,該字符是空終止字符串的開始。 也就是說,每個元素argv[i]
指向數組的第一個元素,其中元素類型為char
(而不是const char
)。 為說明目的給出了一個圖表:
正如在其他答案中已經說過的,當我們想要使用命令行參數時,會使用這種形式的main
聲明。
兩者的
int main(int argc, char *argv[]);
int main();
是 C 或 C++ 程序入口點的合法定義。 Stroustrup:C++ 風格和技術常見問題解答詳細介紹了一些對您的主要功能可能或合法的變體。
如果你從中學到一些東西
#include<iostream>
using namespace std;
int main(int argc, char** argv) {
cout << "This program has " << argc << " arguments:" << endl;
for (int i = 0; i < argc; ++i) {
cout << argv[i] << endl;
}
return 0;
}
該程序有 3 個 arguments。 那么output就會是這個樣子。
C:\Users\user\Desktop\hello.exe
hello
people
使用int
和char**
時,第一個參數將是調用程序的命令數,第二個參數是所有這些命令
只是補充一下,因為有人說有第三個參數( *envp[]
),這是真的,有,但不是 POSIX 安全的,如果你希望你的程序使用環境變量,你應該使用extern char
environ;D
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.