18 Ağustos 2017 Cuma

Raw String Literal

Giriş
Raw iki şekilde tanımlanabilir.

1. Başlangıç Bitiş Karakteri Belirtilmeden
R" (...)" şeklinde tanımlanıyor. Başlangıç karakteri "(, bitiş karakteri ise tersine çevrilmiş hali yani "). Bu kullanımda String'in escape edilmesine gerek kalmaz. Soru işaretinin nasıl escape edildiğini gösteren bir örnek şöyle.
R"(??)"
Çıktı olarak şunu alırız.
"\?\?"

Ekran güzel şeyler bastırmak için şöyle yaparız:
#include <iostream>

int main() {
    using namespace std;
    //Start Screen Begin
    cout << R"( ____  _            _     _            _        )" << '\n';
    cout << R"(| __ )| | __ _  ___| | __(_) __ _  ___| | __    )" << '\n';
    cout << R"(|  _ \| |/ _` |/ __| |/ /| |/ _` |/ __| |/ /    )" << '\n';
    cout << R"(| |_) | | (_| | (__|   < | | (_| | (__|   <     )" << '\n';
    cout << R"(|____/|_|\__,_|\___|_|\_\/ |\__,_|\___|_|\_\    )" << '\n';
    cout << R"(                       |__/                     )" << '\n';
    //Start Screen End
}
2. Başlangıç Bitiş Karakteri Belirtilerek
Normalde başlangıç ve bitiş karakterlerini kullanmaya gerek yok. Ancak string içinde " karakteri varsa, kendimiz tanımlayabiliriz. Başlangıç ve bitiş karakterleri en fazla 16 karakter olabilir.

Örnek
 ### karakterlerini kullanarak şöyle yaparız.
//choose ### as the delimiter so only )###" ends the string
R"###(  
    Some Text)"  
)###";  
Örnek
delim karakterlerini kullanarak şöyle yaparız.
string rawString = R"delim(STRING_WITH_SPECIAL_CHARACTERS)delim";
Örnek
Şöyle yaparız.
std::string s = R"resource(
#include "MyRawTextResource.txt"
)resource";
Örnek
İçinde " karakteri ve new-line barındıran bir başka örnek şöyle. Burada #a( başlangıç, )a" ise bitiş karakterleri
R"a(
)\
a"
)a"
Çıktı olarak şunu alırız.
"\n)\\\na\"\n"
Örnek
cpp kodu üretip derleyen bir program ise şöyle
#include <cstdlib>
#include <fstream>

// Use raw string literal for easy coding
auto prog = R"~(

#include <iostream>

int main()
{
    std::cout << "Hello World!" << '\n';
}

)~"; // raw string literal stops here

int main()
{
  // save program to disk
  std::ofstream("prog.cpp") << prog;

  std::system("g++ -o prog prog.cpp"); // compile
  std::system("./prog"); // run
}
Diğer
Raw String içindeki new-line karakterleri hangi editör kullanılırsa kullanılsın \n'ye denk gelir. Aslında bir kural standartta açık bir dil ile yer almıyor. Ancak standartta verilen örnek şöyle. Dolayısıyla çıkarımda bulunarak bu kuralı kabul ediyoruz.
const char *p = R"(a\
b
c)";
assert(std::strcmp(p, "a\\\nb\nc") == 0);






Hiç yorum yok:

Yorum Gönder