写在前面
记录使用C++时的一些常见问题,难调Bug及相应解决方法。
Link2005 Error的重复定义问题
经过
#ifndef HANDLE_H
#define HANDLE_H
..........
#endif
处理后只能减少重复编译,只解决重复包涵问题,不能解决重复定义问题。
如果大家遇到C++ link2005 error重复定义问题,很明显是链接错误,很有可能是你在头文件中有类外函数的实现或者静态数据的定义。
这个可以这么理解:定义和可以分为两种:类型定义,数据定义。类型定义不分配内存,比如类的定义,结构体的定义,即使数据类型的定义;数据定义分配内存,比如类对象定义,变量定义。函数声明可以看做类型定义,函数实现合一看做数据定义。不分配内存的放在头文件,分配内存的放在cpp,防止重复定义。
CString转换成const char*
在Visual Studio 20XX下,CString直接转换成const char*有点困难。下面是自己用的一种可行方案,这个实例是取得CString类型的图像路径后,将CString转换为char*并使用cvLoadImage读取图像。
//得到目录路径
CString mPath=dlg.GetPathName();
//将目录路径转换成绝对路径以便cvLoadImage调用
int m=mPath.GetLength();
for(int index=0;index<m;index++)
{
if(mPath.GetAt(index)=='\\')
{
mPath.Insert(index,'\\');
index++;
}
}
//将CString转换成LPCTSTR
LPCTSTR p=mPath.GetBuffer();
/*
将LPCTSTR转换为const char *,因为Unicode的问题,LPCTSTR在非UNICODE环境下为 const char * ,在UNICODE环境下为 const unsigned short *
在情况2时需要借助API函数WideCharToMultiByte
int WideCharToMultiByte(
UINT CodePage, // code page
DWORD dwFlags, // performance and mapping flags
LPCWSTR lpWideCharStr, // wide-character string
int cchWideChar, // number of chars in string
LPSTR lpMultiByteStr, // buffer for new string
int cbMultiByte, // size of buffer
LPCSTR lpDefaultChar, // default for unmappable chars
LPBOOL lpUsedDefaultChar // set when default char used
);
*/
DWORD dwMinSize;
dwMinSize=WideCharToMultiByte(CP_ACP,NULL,p,-1,NULL,0,NULL,FALSE);
char * pp=new char[dwMinSize];
WideCharToMultiByte(CP_OEMCP,NULL,p,-1,pp,dwMinSize,NULL,FALSE);
//读取图像
IplImage* ip1=cvLoadImage(pp,-1);
数组引用
类型名 (&变量名)[N]就可以得到一个数组的引用,例:
int array[10];
int (&ref)[10]=array;
在函数传参时,要想进行数组引用,必须指明数组的大小,如:
char a[3]={'a','b','c'};
void fun(char (&buf)[3])
{
buf[0]='d';
}
cout<<a[0]<<endl;
如果想接受任意长度的数组,使用函数模板:
template<size_t size>
void fun(char (&buff)[size])
{
buf[0]=='d';
}
小注
将持续更新。