Råa strängkonstanter

En rå strängkonstant är en sekvens av tecken där det inte finns några undantagstecken. I C++ används i vanliga strängkonstanter backstegstecknet, \, för att representera specialtecken. Sekvenser som \n för ny rad och \t  för tabulatortecken är säkert sånt du känner igen och har ju funnits med i C och sedan C++ sedan urminnes tider. Även andra programmeringsspråk använder den konventionen.

I C++11 finns nu råa strängkonstanter där det inte finns något undantagstecken och tecknen anges alltså precis som de är. Det du ser är det du får och man slipper en massa undantagstecken för att hantera specialbetydelser. Syntaxen i sin enklaste form är så här:

R"(<tecken...>)"

R inleder strängkonstanten och sekvenserna ”(  respektive )” är start- och stoppsekvenser. Några exempel på råa strängkonstanter.

R"(hello "world")"               -> hello "world"
R"(no newline \n or tab \t)"     -> no newline \n or tab \t

R"(
Multiline "string"
          just as it is typed
!)"                               -> 
                                    Multiline "string"
                                              just as it is typed
                                    !

Som du ser i det sista exemplet kan man enkelt skapa långa textmassor eftersom radbrytningar är en del av strängkonstanten!

En situation där de råa strängkonstanterna är behändiga är förstås när strängen innehåller många backstegstecken. I en vanlig strängkonstant måste ju backstegstecknet undantas(!) och man får sekvenser av flera backstegstecken och det blir svårt att se vilken sträng som avses. Reguljära uttryck är ett exempel där undantagstecknet används flitigt och de kommer att dra stor nytta av de råa strängkonstanterna. Att definiera ett korrekt reguljärt uttryck är ju i sig ett knivigt problem så allt som kan göra det enklare är av godo.

För att avsluta beskrivningen av råa strängar finns en sak till värt att nämna. Hur gör man om den avslutande sekvensen )” skall ingå i strängen? Jo, den generella definitionen av en rå strängkonstant tillåter att man definierar en ny start och stoppsekvens så här:

R"<avgränsare>(<tecken...>)<avgränsare>"

Avgränsaren är en sträng på högst 16(!) tecken utan tomrum. Med till exempel avgränsaren # blir den råa strängkonstanten för strängen )” så här:

R"#(')"')#" -> ')"'
Publicerad i C/C++

Kategorier

WP to LinkedIn Auto Publish Powered By : XYZScripts.com