【问题标题】:VC++ macro definition ## operatorVC++宏定义##操作符
【发布时间】:2018-08-10 11:35:35
【问题描述】:

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

谁能帮我理解这个问题?

【问题讨论】:

  • 你用什么_T
  • 是因为您使用的是“ char - 替换为” 另外您可能需要为 _T #include
  • 这个宏到底有什么意义?你尝试得到什么?
  • @Bathsheba - 为微软说这个。这是标准的 Windows 宏。存在大量其他此类(前导下划线后跟大写字母)宏和符号
  • @RbMm:只要您不自己定义它就可以了。是的,没有仔细阅读问题中的代码。我的错。

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


【解决方案1】:

试试这个变种:

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

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

【讨论】:

  • 谢谢@Lex Sergeev。这解决了这个问题。同样将此表达式与## 运算符一起使用似乎也可以正常工作。 _T("Error") ## _T(str) ## _T("\"").
  • 为什么_T("Error") ## _T(str) ## _T("\"") 不是问题? _T(str) 被预处理为“检查”的 str,因此编译器仍应看到 " check "_T
【解决方案2】:

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

"foo" "bar" "baz" 等价于"foobarbaz"

【讨论】:

    【解决方案3】:

    当它试图连接一个右括号和str 以产生一个标记时,它更有可能卡在左边的双尖上。你试过删除它吗?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 2013-03-17
      • 1970-01-01
      相关资源
      最近更新 更多