标签:style blog http ar color 使用 sp for strong
Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源
运行环境: win7 x64 + vs2008
不知道大家是否碰到过这样一个问题:
传递参数时使用类似,_T(“12344”)或”1234”这种形式时,在C++中,会先匹配bool类型的参数,然后才会考虑匹配String参数。
这个结果可能有些出乎意料: 例如下面的这段代码
void Proc(CString sText) { CString sPrompt; sPrompt.Format(_T("Call Proc CString, valus = %s"), sText); AfxMessageBox(sPrompt); }
void Proc(bool b) { CString sPrompt; sPrompt.Format(_T("Call Proc bool, value = %d"), b); AfxMessageBox(sPrompt); }
void CTestCStrArgDlg::OnBnClickedButtonCheck() { // TODO: 在此添加控件通知处理程序代码 Proc(_T("0")); Proc(_T("1")); Proc(_T("100")); Proc(CString(_T("0"))); Proc(CString(_T("1"))); Proc(CString(_T("100"))); } |
运行的结果如下,也就是只有显示的指出参数是CString类型时,才会直接匹配CString类型参数的函数。
Call Proc bool, value = 1
Call Proc bool, value = 1
Call Proc bool, value = 1
Call Proc CString, value = 0
Call Proc CString, value = 1
Call Proc CString, value = 100
当然了,在vs2008中,为bool类型赋值字符串竟然也是允许的,下面这么写编译没有任何问题
bool a = "0";
bool b = _T("1");
但是如果改成int/BOOL/DWORD/char型,就立即会报错了:
error C2440: “初始化”: 无法从“const char [2]”转换为“BOOL”
针对这个问题,我理解成这样:
类似这种“1234”字符串,实际返回的一个字符串的地址,赋值给bool型,意味着判断地址是否为空,所以此时始终获取到true这个值。
针对这种猜测,我简单验证了一下:
TCHAR* pStr = _T("1234");
Proc(pStr);
这样写之后,会收到vc2008的一个警告--重编时这个警告就不见了
warning C4800: “TCHAR *”: 将值强制为布尔值“true”或“false”(性能警告)
运行结果是: Call Proc bool, value = 1
TCHAR* pStr = NULL;
Proc(pStr);
运行结果是: Call Proc bool, value = 0
基于上面两个测试,可以看出,地址参数在传递给bool型时,被转换为地址为空判断了。
所以,后续在使用bool型参数的时候,也或在使用字符串参数的时候,要特别注意了,尽可能指明类型,否则可能出现非预期的结果。
Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源
标签:style blog http ar color 使用 sp for strong
原文地址:http://blog.csdn.net/chunyexiyu/article/details/41842285