3

ご存知かもしれませんが、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 ) ;***************************";

詳細については、こちら(Wikipedia)を参照してください。

私はそれを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を使用していますが、新機能はサポートされていません。自分で実装する必要があります。

4

1 に答える 1

2

ちょっとした補足:あなたが投稿した例は、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;
}
于 2012-12-23T08:37:18.893 に答える