Linux中 C++ main函数参数argc和argv含义及用法
简介
argc
是 argument count的缩写,表示传入main
函数的参数个数;
argv
是 argument vector的缩写,表示传入main
函数的参数序列或指针,并且第一个参数argv[0]
一定是程序的名称,并且包含了程序所在的完整路径,所以确切的说需要我们输入的main
函数的参数个数应该是argc-1个;
实验
直接运行
#include <iostream>using namespace std;int main(int argc, char** argv){for (int i=0; i<argc; ++i){cout << "argument[" << i << "] is : " << argv[i] << endl;}return 0;
}
注意:argv
是指向指针的指针,main
函数的第二个参数char \*argv[]
也可以替换为 char **argv
,两者是等价的。
下面我们在Linux命令行编译运行该程序:
g++ -c test.cpp -o test.o
g++ test.o -o test
./test
输出:
argument[0] is : ./test
可以看到,直接运行的话输出的argv
只有一个参数,即本文件的路径。
传入参数
既然有argc
作为argv
的计数,那么设计时的考量就肯定不可能是只有一个参数。那么怎样想main
函数传入参数呢?
在Windows下,可以通过在集成开发环境IDE(如VS2019)中设置命令参数。
而在Linux下,我们则可以直接通过在命令行运行文件时传入命令参数。
同样时上面的程序,如果我们这样运行:
./test hello world !
注意中间用空格分隔,则会得到输出:
argument[0] is : ./test
argument[1] is : hello
argument[2] is : world
argument[3] is : !
可以看到,三个字符串hello
,world
,!
分别作为argv
的第1,2,3个参数传入了main
函数。
这样我们就可以很方便地在程序运行时,通过命令行向程序传递参数。这是十分有用的,比如用opencv打开指定的图片,存储指定的文件等,只要是在写源代码时不确定,需要根据运行时的具体输入作为参数的程序,均可使用argv
参数。
例程
例1
例如,我们写一个函数,将最后一个argv
参数作为文件名,将前面的参数作为文本内容,写到该文件中:
#include <iostream>
#include <fstream>
#include <string>using namespace std;int main(int argc, char** argv){string fileName = argv[argc-1];ofstream outfile(fileName, ios::trunc);for (int i=1; i<argc-1; ++i){outfile << argv[i] << ' ';}outfile << endl;outfile.close();return 0;
}
编译运行:
g++ -c writeArgv.cpp -o writeArgv.o
g++ writeArgv.o -o writeArgv
./writeArgv Hello main, I am writing argc and argv. writeArgv.txt
成功在writeArgv.txt
中写入:Hello main, I am writing argc and argv.
例2
用argv
命令行传参的方式传入opencv要打开的图像文件:
#include <iostream>
#include <core/core.hpp>
#include <highgui/highgui.hpp>
using namespace std;
using namespace cv;void main(int argc,char **argv){Mat image=imread(argv[1]);imshow("Lena",image);waitKey();
}
注意
-
可以有
argc
和argv
,但是在函数体中没有用,这一点和其他函数也是类似的。 -
有时还有第三个参数,
char** env
,为字符串数组。env
的每一个元素都包含ENVVAR=value
形式的字符串,其中ENVVAR
为环境变量,value
为其对应的值。平时使用到的比较少,一般只用前两个参数argc
、argv
。 -
另外要提醒的是,变量名
argc
和argv
与其他常规C++变量名一样,只要合理且符合规范即可,不一定非要叫argc, argv,如:int main(int count, char** params){// write your code }
都是可以的。
Ref:
https://blog.csdn.net/dcrmg/article/details/51987413
https://blog.csdn.net/dgreh/article/details/80985928