2010-04-08 14 views
14

Ho bisogno di fare il seguente codice C# in C++ (se possibile). Devo constare una lunga stringa con un sacco di citazioni frivole e altre cose in esso.Stringhe letterali C++?

+1

Perché non caricare una stringa così lunga da un file? – GManNickG

risposta

5

Non ci sono letterali di stringa grezza in C++. Dovrai sfuggire alle stringhe letterali.

std::string str = "I can use \"quotes\" inside here"; 

C++ 0x propone una corda grezza letterale quando è disponibile:

R"C:\mypath" 

Tra l'altro, non è necessario denominare qualsiasi cosa con un leader di sottolineatura come tali identificatori sono riservati in C++.

+0

I nomi che iniziano con un trattino basso e quindi seguiti da una lettera maiuscola sono riservati all'implementazione per qualsiasi uso, quindi non è possibile utilizzarli affatto. I nomi che iniziano con un carattere di sottolineatura in generale sono riservati solo come nomi nello spazio dei nomi globale. –

+1

@Brian - le stringhe raw usano parentesi 'R" (C: \ mypath) "' –

2

Non esiste un meccanismo di questo tipo in C++. Dovrai farlo alla vecchia maniera, usando le fughe.

Potrebbe essere possibile utilizzare un linguaggio di scripting per rendere la parte di escape un po 'più semplice. Per esempio, l'operatore %Q in Ruby restituirà una stringa correttamente sfuggito virgolette doppie quando viene utilizzato in irb:

irb(main):003:0> %Q{hello "world" and stuff  with tabs} 
=> "hello \"world\" and stuff\twith\ttabs" 
+0

stai suggerendo seriamente di incorporare un interprete Ruby nel tuo programma C++ solo per sfuggire a una stringa? – jalf

+0

@jalf: Assolutamente no! Stavo suggerendo di incollare la stringa in Ruby una volta, quindi incollare quel risultato nel suo file sorgente. Posso vedere dove la mia risposta potrebbe essere interpretata in quel modo ridicolo, però. –

7

Non esiste un equivalente di "@" C# 's in C++. L'unico modo per realizzarlo è quello di fuggire la stringa correttamente:

const char *_literal = "I can use \"quotes\" inside here"; 
35

che non è disponibile in 03 (l'attuale standard) C++.

Questo è parte dello standard di bozza C++ 0x ma non è ancora disponibile al momento.

Per ora, non resta che citare in modo esplicito:

const std::string _literal = "I have to escape my quotes in \"C++03\""; 

Una volta che C++ 0x diventa realtà, sarete in grado di scrivere:

const std::string _literal = R"(but "C++0x" has raw string literals)"; 

e quando hai bisogno )" letterale:

const std::string _literal = R"DELIM(more "(raw string)" fun)DELIM"; 
+7

+1 per educarmi. – paxdiablo

+0

@paxdiablo - prego. Su una nota a margine, il mio precedente esempio era errato. Le stringhe raw usano parentesi, non parentesi quadre come delimitatori. Anche le stringhe non elaborate hanno una maggiore flessibilità rispetto al mio esempio (è possibile aggiungere un delimitatore in modo da poter mettere ')" 'nella stringa effettiva. –

+0

+1 per la parte DELIM, davvero utile. – qed

Problemi correlati