首页 > 代码库 > bool类型匹配了字符串

bool类型匹配了字符串

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 = http://www.mamicode.com/%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 = http://www.mamicode.com/1

Call Proc bool, value = http://www.mamicode.com/1

Call Proc bool, value = http://www.mamicode.com/1

Call Proc CString, value = http://www.mamicode.com/0

Call Proc CString, value = http://www.mamicode.com/1

Call Proc CString, value = http://www.mamicode.com/100

 

当然了,在vs2008中,为bool类型赋值字符串竟然也是允许的,下面这么写编译没有任何问题

bool a = "0";

bool b = _T("1");

但是如果改成int/BOOL/DWORD/char型,就立即会报错了:

error C2440: “初始化”: 无法从“const char [2]”转换为“BOOL”

 

针对这个问题,我理解成这样:

类似这种“1234”字符串,实际返回的一个字符串的地址,赋值给bool型,意味着判断地址是否为空,所以此时始终获取到true这个值。

 

针对这种猜测,我简单验证了一下:

    TCHARpStr = _T("1234");

    Proc(pStr);

这样写之后,会收到vc2008的一个警告--重编时这个警告就不见了

warning C4800: “TCHAR *”: 将值强制为布尔值“true”或“false”(性能警告)

运行结果是: Call Proc bool, value = http://www.mamicode.com/1

    TCHARpStr = NULL;

    Proc(pStr);

运行结果是: Call Proc bool, value = http://www.mamicode.com/0

 

基于上面两个测试,可以看出,地址参数在传递给bool型时,被转换为地址为空判断了。

 

所以,后续在使用bool型参数的时候,也或在使用字符串参数的时候,要特别注意了,尽可能指明类型,否则可能出现非预期的结果。

 

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源

 

bool类型匹配了字符串