opencv命名规范约定;argc与argv参数解惑;vs中main函数的几种写法说明
一,命名规范约定
使用一套成熟的命名规则,不仅可以让我们规范形事,还可以让别人在阅读我们写的代码时,更快理解,增强代码的可读性,方便个程序员的相互交流代码。下图为一些命名规则约定:
匈牙利命名法:变量名=属性+类型+对象描述
如图
二,argc和argv参数解惑
在与OpenCV打交道时,我们常会在相关的示例程序中见到argc和 argv这两个参数,如 OpenCV的官方示例程序Samples中、OpenCV经典教材《LearningOpenCV》中,等等。这常常会让众多初学者疑惑,不清楚它们是何用途。
argc和 argc 中的 arg 指的是“参数”(例如: arguments,argument counter和argument vector)。其中,argc为整数,用来统计运行程序时送给main函数的命令行参数的个数;而* argv[ ]:为字符串数组,用来存放指向字符串参数的指针数组,每一个元素指向一个参数。
Argc,argc这两个参数一般在用命令行编译程序时有用。在初学C++时,往往要弱化argc和 argv的用法,main函数常常不带参数。
而在 opencv的官方示例程序中,main函数的写法常常会带上两个形参,一般为argc和l argv,并且在函数体内部会使用到这两个形参,如下:
int main ( int argc,char* * argv ){
const char* imagename = argc > 1 ? argv [1] : "lena.jpg" ;……...}
其实,带形参的main函数,如 main ( int argc,char *argv[ ],char **env),是UNIX、Linux 以及 Mac OS操作系统中C/C++的main 函数的标准写法,并且是血统最纯正的 main函数的写法。可能是由于外国的专家们更习惯使用UNIX、Linux 以及Mac OS等操作系统,所以我们接触到由他们开发和维护的OpenCV这款开源视觉库的时候,自然会发现代码中常有argc和 argv的出现。
值得注意的是:
argc、argv 和env是在main()函数之前被赋值的。其实,main()函数严格意义上并不是真正的程序入口点函数,往往入口点还与操作系统有关。而在 Windows的控制台应用程序中,将main)函数作为程序入口点,并且很少使用argc、argv等命令行参数。
三,vs中main函数的几种写法说明
需要注意的是,在如今各版本的Visual Stuidio编译器中,main()函数带参数argc和 argv或不带,也就是说,无论我们是否在函数体中使用argc和 argv,返回值为 void或不为void,都是合法的。
即至少有如下3种写法合法。
1.【写法一】返回值为整型带参的main函数
int main( int argc,char* * argv ){
//函数体内使用或不使用argc和argv都可行....--
return l;}
2.【写法二】返回值为整型不带参的main函数
int main( int argc, char* * argv )
{
/函数体内使用了argc或argv--
return 1;
}
3.【写法三】返回值为void且不带参的main函数
int main ()
{
…..
return 1;
}
在 Visual Studio中,如果使用了argv或argc,即上文代码中的第一种写法,且在使用之前没有在【项目属性】→【配置属性】→【调试】→【命令参数】中指定参数的值,就会报错,这是研究OpenCV官方提供的示例程序时经常碰到的错误。
解决此问题并编译通过,除了上文讲过的在项目属性页中填上命令参数外,最简单的做法就是在不影响原始程序的基础上,将和 argv或argc有关的代码进行替换或注释。
比如将“Mat srcImage=imread ( argv[1],1);//读取字符串名为argv[1]的图片”替换为“Mat srcImage=imread (“" 1.jpg”,1);lI工程目录下有一张名为“1.jpg”的图片”。
最后总结:
读者应该对argc和 argv有了比较透彻的认识。简单来说
int argc表示命令行字串的个数
char *argv[]表示命令行参数的字符串
由于我们使用的开发环境为Visual Studio,往后若在OpenCV相关代码中遇到这两个参数,可以在代码中将其用路径字符串替换,或者在项目属性页中给其赋值,而对程序整体影响不大的部分就将其注释掉。