VC ++宏定义##运算符

时间:2018-08-10 11:35:36

标签: c++ visual-c++ c++14 preprocessor

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

有人可以帮助我了解这个问题吗?

3 个答案:

答案 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(“\””); }