C++ main函数中参数argc和argv相关定义与研究
最近在研究opencv代码,在读取图上时遇到了一些问题。因此把它总结一下,方便学习。
argc 则是 argument count的缩写,表示传入main函数的参数个数;
argv 则是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0]一定是程序的名称(即:xx.exe),并且包含了程序所在的完整路径,因此我们输入的main函数的参数个数应该是(argc-1)个。
通常在C++控制台应用程序中,主函数通常是 int _tmain(int argc, _TCHAR* argv[])(VS2010、VS2012、VS2013、VS2015等高版本的编译器);
而在C++控制台程序中,主函数一般是int main(int argc, char** argv) (VS2008等较低版本的)。
当然,其实argv是指向指针的指针,main函数的第二个参数“char *argv[]“也可以替换为 “char **argv“、 _TCHAR* argv[],都是等价的。
首先,粘贴个小程序,显示一下argv[] 。本组实验全部基于VS2012 C++编译平台,OpenCV2.4.9版本进行编译。
// argv_learn.cpp : 定义控制台应用程序的入口点。
// yyx_agrv_learning: C++ main函数中参数argc和argv含义及用法
#include "stdafx.h"
#include <iostream>
//#include <opencv2/core/core.hpp>
using namespace std;
//using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
system("color 1C");//表示输出框的背景颜色
for(int i=0;i<argc;i++)
{
cout<<"argument["<<i<<"] is: "<<argv[i]<<endl;
cout<<"------------编译人员姚永祥-----------"<<endl;
}
system("pause");
return 0;
}
运行之后的结果图,如下所示:
从结果可只,在没有参数传入的情况下,保存程序名称的第一个变量argv[0]依然存在。
同时,传参数给main函数有两种方法,第一种方式是在编译环境中设置,比较简单粗暴,不过不建议直接这样使用。
以vs2012编译平台为例,右击项目—>属性—>配置属性—>调试—>命令参数,在命令参数中输入,每个参数之间用空格隔开。
但是一般是做项目,比如用opencv读取图片的时候,如果直接将路径写成绝对路径,后期调试比较麻烦。因此,在图片不是很多的情况下,可以直接将图片保存在工程文件中。
图片命名为“test.jpg”.
然后,附上一段代码:
// argv_learn.cpp : 定义控制台应用程序的入口点。
// yyx_agrv_learning: C++ main函数中参数argc和argv含义及用法
#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
system("color 1C");//表示输出框的背景颜色
Mat image = imread(argv[1] = "test.jpg",0);
imshow("test",image);
waitKey();
return 0;
}
结果如下:
注:由于有些使用的是使用 Unicode 字符集,因此程序会报错!
1 IntelliSense: 不能将 "const char *" 类型的值分配到 "_TCHAR *" 类型的实体 d:\OPencv-data\argv_learn\argv_learn\argv_learn.cpp 17 31 argv_learn
解决方法:
选择“项目文件”(argv_learn)右击“属性”。打开后,选择 配置属性—>常规—>字符集 编辑中选择“使用多字节字符集”,点击确定即可!
到此程序就可以正确运行。当然,对argc 和argv的理解还不够深刻,后续还需要继续学习!!
上一篇: main函数的参数解析