2012-01-22 14 views
9

Czy istnieje sposób w C++, aby zacytować ciąg bez ucieczki z ukośnikami? Na przykład chciałbym zapisać jakiś kod Latex w ciągu znaków, na przykład \documentclass{article}. Mogłem zrobićCytaty w stylu Perla dla długich łańcuchów w C++

string latex_code = "\\documentclass{article}" 

Ale to dostaje irytujące, kiedy trzeba uciekać się wiele rzeczy, na przykład, jeśli masz dużo kodu lateksu. W Perlu pamiętam, że masz bardzo przydatne narzędzia do cytowania. Zobacz na przykład sekcje "q" i "qq" tutaj: http://www.perlmonks.org/?node_id=401006

Czy jest coś podobnego w C++? Jedyne, co mogę wymyślić to wklejenie kodu Latex do zewnętrznego pliku i przeczytanie go. Ale to też wydaje się denerwujące.

Odpowiedz

12

C++ 11 ma sposób:

R"(The String Data \ Stuff ")" 
R"delimiter(The String Data \ Stuff ")delimiter" 

w pierwszym przypadku, wszystko pomiędzy "(i)" jest częścią łańcucha. Znaków "i \ nie trzeba zamykać", w drugim przypadku "ogranicznik (rozpoczyna łańcuch, a kończy się dopiero gdy) ogranicznik" może być dowolnym łańcuchem o długości do 16 znaków, łącznie z pustym ciągiem.Ten ciąg nie może zawierać spacji, znaków kontrolnych, '(', ')' lub znaku '\ .Użycie tego łańcucha separatora pozwala użytkownikowi na używanie ") znaków w surowych ciągach literowych. Przykład R "ogranicznik ((AZ)) separatora" jest równoznaczne z "(AZ)"

http://en.wikipedia.org/wiki/C%2B%2B11

niemożliwe C++ 03.

4

C++ 0x ma several new string literals. Jednym z nich jest surowy tekst dosłowny, który pozwala ci używać różnych ograniczników dla ciebie. Ciągi nieprzetworzone zaczynają się od znaku R. Podstawowy łańcuch literowy w postaci surowej to R"(Hello, World!)". Tutaj wszystko pomiędzy "( i )" jest częścią ciągu.

Można również określić różne ograniczniki, umieszczając ciąg znaków między znakami " i (. Na przykład nieprzetworzony ciąg R"delimiter(Hello, World!)delimiter" jest taki sam, jak powyżej, z wyjątkiem tego, że używa separatora jako "delimiter(. Część delimiter może zawierać maksymalnie 16 znaków i nie może zawierać spacji, (, ) lub / znaków.

Ponieważ jest to funkcja C++ 0x, wymaga kompilatora zgodnego ze standardem C++ 0x. Wygląda na to, że gcc obsługuje tę funkcję, ponieważ wersja 4.5 i clang ma od wersji 3.0.