我正在尝试将我们的解决方案从VS2010移植到VS2017,并通过涉及令牌粘贴运算符的宏定义遇到了此编译错误。这是下面的代码
#include “stdafx.h”
#define TEST_MACRO(str) \
{ \
_T(“Error”) ## str ## _T(“\””); \
}
int main()
{
TEST_MACRO(“ check “);
return 0;
}
此方法在VS2010中可正常编译,但在VS2017 / VS2015中可失败。在str ##之后似乎看不到_T(“ \””)。我使用的是“多字节字符集”,因此_T(x)解析为x(在tchar.h中)。
有人可以帮助我了解这个问题吗?
答案 0 :(得分:1)
您不需要##
。串联字符串文字是没有意义的。
"foo" "bar" "baz"
等效于"foobarbaz"
。
答案 1 :(得分:1)
尝试使用此变体:
#define TEST_MACRO(str) \
{ \
_T("Error") _T(str) _T("\""); \
}
使用##
连接字符串,对于编译器,它看起来像:_T("Error")" check "_T("\"")
。 " check "_T
在这里是个问题。这是用户定义的文字_T
,未定义
答案 2 :(得分:0)
在尝试将右括号和str
连接以生成令牌时,它更有可能卡在左侧的双尖锐字符上。您是否尝试将其删除?
#define TEST_MACRO(str) { _T(“Error”) str ## _T(“\””); }