MFC中为什么无法将字符字面值赋给CString

今天,遇到了一个奇怪的问题,MFC代码中无法将字符字面值赋给CString。
代码中这句为:

CString strNew = _T(',');

结果编译的时候报错:无法将wchar_t转为CString。在这里插入图片描述

这就纳闷了,其他的工程都可以啊,接下来找到CString的头文件,发现了问题:
在这里插入图片描述
画红线的宏定义为
#define CSTRING_EXPLICIT explicit
原来,单个字符构造CString的构造函数是显式的(explicit),因此编译器编译 CString strNew = _T(‘,’);时,调用了CString的构造函数,然后发现对应的构造函数是显式的,因此,就直接报错了。这里必须说明一句,这可能是VS编译器不合理的一点,实际上在赋值运算符中,是可以将单个字符赋给CString的,编译器完全可以利用默认构造函数生成strNew对象,再将 _T(‘,’) 赋值给这个strNew;但是,VS编译器优先找到参数相符的构造函数,然后检查到其为explicit,然后直接报错。
那么,如何规避这个错误呢?

  1. 方法1
//CString在初始化以后,可以用字符字面值进行赋值,此时调用的是=号运算符
	CString strNew2;
	strNew2 = _T('x');

//显式调用单个字符构造函数,编译无问题
	CString strNew3(_T(','));
  1. 方法2
    因为自己其他工程用的很多都没问题,我就仔细对比了一下,发现可以利用宏开关处理一下。
    在cstringt.h中,有以下几行宏代码,意思是如果定义了 _ATL_CSTRING_EXPLICIT_CONSTRUCTORS 宏,CSTRING_EXPLICIT 就是 explicit;否则 CSTRING_EXPLICIT 其为空。在这里插入图片描述
    刚刚提到了参数为单个字符的CString构造函数前面就加了 CSTRING_EXPLICIT 宏,所以是explicit的。那我工程取消 _ATL_CSTRING_EXPLICIT_CONSTRUCTORS 的定义是不是就好了?带着这样的疑惑,我打开了 framework.h 头文件(pch.h 头文件包含 #include “framework.h”),果然,找到了以下几行
    在这里插入图片描述
    原来在framework.h中定义了宏 _ATL_CSTRING_EXPLICIT_CONSTRUCTORS ,注释掉这一行,再编译即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_Santiago

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值