Mfc 宏不适用于Visual Studio 2017
我试图使用Visual Studio 2017 RC,但遇到了一个问题 我很感激这是唯一的发行候选 在我2015年的项目中,我有一个宏:Mfc 宏不适用于Visual Studio 2017,mfc,macros,visual-studio-2017,Mfc,Macros,Visual Studio 2017,我试图使用Visual Studio 2017 RC,但遇到了一个问题 我很感激这是唯一的发行候选 在我2015年的项目中,我有一个宏: #define SMLABEL(a) GetSMLabel(a, #a) 以下是相关的方法: CString CChristianLifeMinistryEditorDlg::GetSMLabel(UINT uID, CString strLabel) { CString strText; if (theApp.UseTranslation
#define SMLABEL(a) GetSMLabel(a, #a)
以下是相关的方法:
CString CChristianLifeMinistryEditorDlg::GetSMLabel(UINT uID, CString strLabel)
{
CString strText;
if (theApp.UseTranslationINI())
strText = theApp.GetSMLabel(strLabel);
else
strText.LoadString(uID);
return strText;
}
以下是使用宏的示例:
strDate.FormatMessage(SMLABEL(IDS_STR_TPL_OCLM_WEEK),
theApp.CustomFormatDate(datThisMonday, _T("%B")), datThisMonday.GetDay(), datEndOfWeek.GetDay());
#define SMLABEL(a) GetSMLabel(a, CString(#a))
在VS2015中,它的编译和工作没有问题
但是使用新的编译器,我得到了以下构建错误:
1> ChristianLifeMinistryEditorDlg.cpp(471):错误C2664:'CString
CChristianLifeMinistryEditorDlg::GetSMLabel(UINT,CString)“”:无法
将参数2从“常量字符[22]”转换为“CString”
1> ChristianLifeMinistryEditorDlg.cpp(471):注:类的构造函数
'ATL::CStringT>>'
声明为“显式”
显然,第二个参数存在问题,但我不知道如何重新定义宏声明
更新:
我已尝试将我的GetSMLabel
方法更改为第二个参数LPTSTR
或TCHAR*
,但它不会编译
我知道当我在宏中使用#时,它会将其转换为字符串文字。新的编译器不喜欢这样
还尝试更改宏:
strDate.FormatMessage(SMLABEL(IDS_STR_TPL_OCLM_WEEK),
theApp.CustomFormatDate(datThisMonday, _T("%B")), datThisMonday.GetDay(), datEndOfWeek.GetDay());
#define SMLABEL(a) GetSMLabel(a, CString(#a))
仍然不起作用。假设您的项目设置为使用Unicode,这似乎是一个突破性的变化,因为默认情况下,
CStringT
的属性现在被标记为显式。如果是这种情况,您有两个选择:将宏更改为使用显式构造函数调用(对于第二个参数),或者让宏生成宽字符串。建议使用后者,但我不确定是否可以将\a
替换为\T(#a)
。这可能需要一个额外的间接过程。我承认,我不完全理解明确的意思和含义。但是你关于使用\u T(#a)
的建议奏效了。呸!现在只剩下最后一个编译错误。我会问我是否卡住了(它是从const char*
变量中分配CString
变量。CString strWeek=pWeek->Name();
这是一个单独的问题吗?我认为这是一个相关的问题。根本原因可能是相关的,但解决方案是不同的(或者可能不是)。如果可能,请更改pWeek->Name()
以返回宽字符串。如果不可能或不可行,则需要显式构造函数调用。我相信CString strWeek{pWeek->Name()}
应该可以工作。假设您的项目设置为使用Unicode,这似乎是一个突破性的更改,因为CStringT
的默认值现在标记为显式。如果是这种情况,您有两个选项:将宏更改为使用显式构造函数调用(对于第二个参数),或者让宏生成一个宽字符串。建议使用后者,尽管我不确定是否可以用\T(\a)
替换\a
。这可能需要额外的间接处理。我承认我不完全理解显式的含义。但是你关于使用\T(\a)的建议
worked.Phew!现在只剩下最后一个编译错误。我会问我是否卡住了(它正在从const char*
变量分配CString变量。CString strWeek=pWeek->Name()
这是一个单独的问题吗?我认为这是一个相关的问题。根本原因可能是相关的,但解决方案是另一个(或可能不是)。如果可能,请更改pWeek->Name()
返回宽字符串。如果不可能或不可行,则需要显式构造函数调用。我相信CString strWeek{pWeek->Name()};
应该可以工作。