VC++宏定义##运算符

VC++ macro definition ## operator

我正在尝试将我们的解决方案从 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 中)。

谁能帮我理解这个问题?

它更有可能卡在左边的双升号上,因为它试图连接右括号和 str 以生成标记。您是否尝试删除它?

#define TEST_MACRO(str) { _T(“Error”) str ## _T(“\””); }

您不需要 ##。连接字符串文字是没有意义的。

"foo" "bar" "baz" 等同于 "foobarbaz".

试试这个变体:

#define TEST_MACRO(str) \
{                                  \
     _T("Error") _T(str) _T("\""); \
}

使用 ## 连接字符串,编译器看起来像:_T("Error")" check "_T("\"")" check "_T 在这里是个问题。它是一个用户定义的文字_T,它是未定义的