微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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 ,注释掉这一行,再编译即可。

原文地址:https://www.jb51.cc/wenti/3283702.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐