Mfc 宏不适用于Visual Studio 2017

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

我试图使用Visual Studio 2017 RC,但遇到了一个问题

我很感激这是唯一的发行候选

在我2015年的项目中,我有一个宏:

#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()};
应该可以工作。