Qualcosa di simile di stampa FINE << END; in C ++?
-
20-09-2019 - |
Domanda
Esiste un modo per fare qualcosa di simile PHP di
print << END
yadayadayada
END;
in C ++? (Multi-linea,, inserimento flusso escape facile da tagliare e incollare)
Soluzione
Questa risposta è ormai obsoleto per la moderna C ++ - vedi di SBI risposta per il modo moderno <. / strong>
Questa è la migliore che puoi fare:
std::cout <<
"This is a\n"
"multiline\n"
"string.\n";
Non è così conveniente come una vera e propria heredoc, ma non è terribile.
Altri suggerimenti
C ++ 11 ha grezzo letterali :
// this doesn't have '\n', but '\\' and 'n'
R"(yada"yadayada\n)"
E se avete bisogno di quei parentesi, si può fare anche quello, utilizzando quello che vuoi per un token di fine:
// the following will be "(yada)(yada)(yada)"
R"END((yada)(yada)(yada))END"
funziona anche con nuove linee incorporate:
// the following will be "\n(yada)\n(yada)\n(yada)\n"
R"END(
(yada)
(yada)
(yada)
)END"
In C ++, non è di solito considerato stile di codice a mettere grandi quantità di dati in codice sorgente, quindi non c'è un modo di lingua di fantasia per farlo.
Di solito è più flessibile per mettere il testo in un file esterno (ad esempio un file di testo), quindi non è vincolato nella eseguibile compilato.
Se si desidera il testo ad essere vincolato nell'eseguibile poi (a seconda della piattaforma), spesso è possibile utilizzare una qualche forma di risorse di sostegno, o un assemblatore con una direttiva stile 'incbin' a dare nome ad una zona di dati con il testo che si desidera.
In alternativa, è possibile utilizzare un programma di utilità esterno (come xxd -i
) a compilatore un array di stile C di nome da un dato file di input. Il file generato può essere compilato con il resto del codice sorgente.
Sì. http://en.cppreference.com/w/cpp/language/string_literal
const char* s1 = R"foo(
Hello
World
)foo";
//same as
const char* s2 = "\nHello\nWorld\n";
O se non si tratta di best-practice, C ++ 11 fa abbastanza bene esattamente quello che vuoi.
Si può fare in questo modo:
std::cout << "First line\n"
"second line\n"
"third line\n" ;
E questo è il meglio che puoi fare con il C ++.
Non c'è cosa come un heredoc in C ++.
Si può fare
cout <<
"yadayadayada"
"yadayadayada"
<< endl;
Questa è la migliore che si può ottenere. Ma si deve ancora sfuggire caratteri speciali come \ ", '.
Il modo in cui sarebbe includere il testo come un ressource nel eseguibile o caricarlo da un file esterno.
A slash alla fine di una riga indica la riga successiva è una continuazione della stringa. Questo ti porta ad una sintassi alternativa che si può o non può preferire rispetto ad altri suggerimenti:
std::cout << "\
This is a\n\
multiline\n\
string.\
";
I vantaggi: non si dispone di avvolgere ogni linea tra virgolette; durante l'importazione di testo da qualche altra fonte è sufficiente modificare una fine di ogni riga, non entrambe le estremità (più macro friendly); e si può vedere esattamente come la stringa risultante sarà, tra cui spazi iniziali.
Gli svantaggi: è ancora necessario includere esplicitamente \ n per nuove righe, e non mi piace perdere la capacità di rientrare il mio codice bello e abbastanza. sintassi heredoc soffre anche di questa caratteristica, quindi forse non ti disturberà.
Personalmente, questa non è una sintassi che mi piace.
Se ho capito bene, credo che si desidera che questo:
#include <iostream>
...
std::cout << std::endl << "yadayadayada" << std::endl;