如何在 VIsual C++ 2010 中实现 C++ 原始字符串文字?

Posted

技术标签:

【中文标题】如何在 VIsual C++ 2010 中实现 C++ 原始字符串文字?【英文标题】:How to implement C++ raw string literals in VIsual C++ 2010? 【发布时间】:2012-12-23 03:12:58 【问题描述】:

您可能已经知道,C++ 11 中的新字符串文字可以以非常灵活的方式表示。

R"<delim>...<delim>"; - 在这段代码中,<delim> 几乎可以是所有东西,也不需要转义字符。任何类型的括号都可以用来分隔字符串的结尾,原始字符串文字在定义正则表达式时特别有用:

R"(I love those who yearn for the impossible. (Von Goethe, "Faust"))";

文本块可以简单地使用相同字符的相等次数来定义:

R";***************************( ; TINY BASIC FOR INTEL 8080 ; VERSION 2.0 ; BY LI-CHEN WANG ; MODIFIED AND TRANSLATED ; TO INTEL MNEMONICS ; BY ROGER RAUSKOLB ; 10 OCTOBER, 1976 ; @COPYLEFT ; ALL WRONGS RESERVED ) ;***************************";

更多信息可以在here(***)找到。

我想用 C++ 处理器来实现它,这就是我所拥有的。现在不支持双引号了,我需要像C++ 11一样去竞争。谁能帮帮我?

#define STR(a) #a
#define R(var, re)  static char var##_[] = STR(re);\
const char * var = ( var##_[ sizeof(var##_) - 2] = '\0',  (var##_ + 1) );

你可以这样使用它:

R(re, "\w\d");//It's OK, no warnings.

代码使用不友好。所以我想要像 C++ 11 原始字符串文字这样的功能。

PS:我用的是Visual C++ 2010,不支持新功能,必须自己实现。

【问题讨论】:

我非常怀疑如果没有某种内置语言支持,您能否做得更好。 为什么不呢?你有什么建议? @Triumphant:假设,如果这个可以纯粹作为一个预处理器来实现,为什么标准委员会会费心把它变成一个核心语言特性呢? :) 【参考方案1】:

附带说明:您发布的示例不是 C++11 标准中的原始字符串文字。标记不得超过 16 个字符,并且以 ') ;' 结尾与开始标记不匹配。不允许有空格。另一方面,这适用于 Visual Studio 2012+ CTP (http://scrupulousabstractions.tumblr.com/post/36204698243/setupcpp11-msvs)

#include <string>
#include <iostream>

int main()

    std::string x=R";************(; TINY BASIC FOR INTEL 8080
    ; VERSION 2.0
    ; 10 OCTOBER, 1976
    ; @COPYLEFT
    ; ALL WRONGS RESERVED );************";
    std::cout << x <<std::endl;    
    return 0;

【讨论】:

在 Visual Studio 2012 中无法为我编译 CTP 是必需的。看看我的链接。

以上是关于如何在 VIsual C++ 2010 中实现 C++ 原始字符串文字?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 无法在 Visual Studio 中实现抽象类

如何在 GUI 中实现我的 while 循环以使用 Visual Studio 在 C/C++ 中保持按键

在 Visual Studio 6 中从 VB 调用 VS2010 C++ dll

在 Visual Studio 2015 解决方案中实现 C++ 模板的正确方法是啥?

你如何在 C 中实现一个类? [关闭]

在 Visual Studio 2012 中编译启用 CLR 的 C++ 项目时出现 C2248 错误