bool类型匹配了字符串

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

运行环境: win7 x64 + vs2008

 

不知道大家是否碰到过这样一个问题:

传递参数时使用类似,_T(“12344”)或”1234”这种形式时,在C++中,会先匹配bool类型的参数,然后才会考虑匹配String参数。

 

这个结果可能有些出乎意料: 例如下面的这段代码

void Proc(CString s)

{

    CString sPrompt;

    sPrompt.Format(_T("Call Proc CString, value = %s"), s);

    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这个值。

 

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

    TCHARpStr = _T("1234");

    Proc(pStr);

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

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

运行结果是: Call Proc bool, value = 1

    TCHARpStr = NULL;

    Proc(pStr);

运行结果是: Call Proc bool, value = 0

 

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

 

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

对于如何让编译器正确的识别char* 或 TCHAR这种情况,近来看到stackoverlfow上面的解答,特把处理方法 贴出来:定义一个 const char* 类型参数的,可以解决匹配到 bool的情况

定义样例如下:

void Proc(const char* pText)
{
    CString sPrompt;
    sPrompt.Format(_T("Call Proc char*, value = %s"), pText);
    AfxMessageBox(sPrompt);
}

 

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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春夜喜雨

稀罕你的喜欢!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值