1

似乎 Visual Studio 2013 编译器中存在一个关于 C++11 原始字符串支持的错误。

C++11 中的新原始字符串看起来像R"(\s(\d+))"; 它们对于正则表达式和多行字符串非常方便。Visual Studio 2013(和 VS 2012 November CTP)支持它们,但如果你将原始字符串放在宏中(即使是简单的),可能会发生不好的事情。

这个简单的代码编译但断言失败:

#include <assert.h>
#include <string.h>

#define M(s) s

int main(int argc, char* argv[])
{
    const char* s1 = M(R"()\s)");
    const char* s2 =   R"()\s)";
    assert(strcmp(s1, s2) == 0);
    return 0;
}

笔记:

  • 宏尽可能简单。
  • 如果字符串内的右括号被删除,一切正常。
  • 如果字符串内的反斜杠或's'字母被删除,则代码无法编译!

这真的是编译器错误吗?如果是,这是一个已知的错误吗?有解决方法吗?

4

0 回答 0