似乎 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'
字母被删除,则代码无法编译!
这真的是编译器错误吗?如果是,这是一个已知的错误吗?有解决方法吗?