Что-то вроде print END << END; в С++?

Есть ли способ сделать что-то вроде PHP

print << END
yadayadayada
END;

в С++? (многострочная, неизолированная, простая вставка и вставка потока)

Ответ 1

Этот ответ теперь устарел для современного С++ - см. sbi answer для современного способа.

Это лучшее, что вы можете сделать:

std::cout <<
    "This is a\n"
    "multiline\n"
    "string.\n";

Не так удобно, как правильный heredoc, но не страшный.

Ответ 2

С++ 11 имеет raw строковые литералы:

// this doesn't have '\n', but '\\' and 'n'
R"(yada"yadayada\n)" 

И если вам нужны эти парнеры, вы можете сделать это тоже, используя то, что хотите для конечного токена:

// the following will be "(yada)(yada)(yada)"
R"END((yada)(yada)(yada))END" 

он также работает со встроенными новыми строками:

// the following will be "\n(yada)\n(yada)\n(yada)\n"
R"END(
(yada)
(yada)
(yada)
)END" 

Ответ 3

В С++ обычно не рассматривается стиль кода для размещения больших объемов данных в исходном коде, поэтому для него не существует причудливого языкового способа.

Как правило, более гибко помещать текст во внешний файл (например, текстовый файл), тогда он не привязан к скомпилированному исполняемому файлу.

Если вы хотите, чтобы текст был связан с исполняемым файлом, тогда (в зависимости от вашей платформы) вы часто можете использовать некоторую поддержку ресурсов или ассемблер с директивой стиля "incbin", чтобы дать имя области данных с текст, который вы хотите.

В качестве альтернативы вы можете использовать внешнюю утилиту (например, xxd -i) для компиляции массива названного C-стиля из заданного входного файла. Сгенерированный файл затем может быть скомпилирован с остальной частью исходного кода.

Ответ 4

Да. 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";

Независимо от того, работает ли это лучше всего, С++ 11 отлично подходит именно вам.

Ответ 5

Вы можете сделать следующее:

std::cout << "First line\n"
"second line\n"
"third line\n" ;

И это лучшее, что вы можете сделать с С++.

Ответ 6

В С++ нет такой вещи, как HEREDOC.

Вы можете сделать

cout << 
"yadayadayada"
"yadayadayada"
<< endl;

Это лучшее, что вы можете получить. Но вам все равно придется избегать особых символов, таких как \, ",".

Можно было бы включить текст в качестве исходного файла в исполняемый файл или загрузить его из внешнего файла.

Ответ 7

Слэш в конце строки означает, что следующая строка является продолжением строки. Это приводит к альтернативному синтаксису, который вы можете или не можете предпочесть другим предложениям:

std::cout << "\
This is a\n\
multiline\n\
string.\
";

Преимущества: вам не нужно обертывать каждую строку в кавычки; при импорте текста из какого-либо другого источника вам нужно только отредактировать один конец каждой строки, а не оба конца (более дружественный макрос); и вы можете точно увидеть, как будет выглядеть результирующая строка, включая начальные пробелы.

Недостатки: вам все равно нужно явно включать \n для строк новой строки, и мне не нравится потерять возможность отступать от моего кода красиво и красиво. Синтаксис HEREDOC также страдает от этой функции, поэтому, возможно, это вас не беспокоит.

Лично это не синтаксис, который мне нравится.

Ответ 8

Если я правильно вас понимаю, я считаю, что вам нужно это:

#include <iostream>
...
std::cout << std::endl << "yadayadayada" << std::endl;