Есть ли способ сделать что-то вроде PHP
print << END
yadayadayada
END;
в С++? (многострочная, неизолированная, простая вставка и вставка потока)
Есть ли способ сделать что-то вроде PHP
print << END
yadayadayada
END;
в С++? (многострочная, неизолированная, простая вставка и вставка потока)
Этот ответ теперь устарел для современного С++ - см. sbi answer для современного способа.
Это лучшее, что вы можете сделать:
std::cout <<
"This is a\n"
"multiline\n"
"string.\n";
Не так удобно, как правильный heredoc, но не страшный.
С++ 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"
В С++ обычно не рассматривается стиль кода для размещения больших объемов данных в исходном коде, поэтому для него не существует причудливого языкового способа.
Как правило, более гибко помещать текст во внешний файл (например, текстовый файл), тогда он не привязан к скомпилированному исполняемому файлу.
Если вы хотите, чтобы текст был связан с исполняемым файлом, тогда (в зависимости от вашей платформы) вы часто можете использовать некоторую поддержку ресурсов или ассемблер с директивой стиля "incbin", чтобы дать имя области данных с текст, который вы хотите.
В качестве альтернативы вы можете использовать внешнюю утилиту (например, xxd -i
) для компиляции массива названного C-стиля из заданного входного файла. Сгенерированный файл затем может быть скомпилирован с остальной частью исходного кода.
Да. 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 отлично подходит именно вам.
Вы можете сделать следующее:
std::cout << "First line\n"
"second line\n"
"third line\n" ;
И это лучшее, что вы можете сделать с С++.
В С++ нет такой вещи, как HEREDOC.
Вы можете сделать
cout <<
"yadayadayada"
"yadayadayada"
<< endl;
Это лучшее, что вы можете получить. Но вам все равно придется избегать особых символов, таких как \, ",".
Можно было бы включить текст в качестве исходного файла в исполняемый файл или загрузить его из внешнего файла.
Слэш в конце строки означает, что следующая строка является продолжением строки. Это приводит к альтернативному синтаксису, который вы можете или не можете предпочесть другим предложениям:
std::cout << "\
This is a\n\
multiline\n\
string.\
";
Преимущества: вам не нужно обертывать каждую строку в кавычки; при импорте текста из какого-либо другого источника вам нужно только отредактировать один конец каждой строки, а не оба конца (более дружественный макрос); и вы можете точно увидеть, как будет выглядеть результирующая строка, включая начальные пробелы.
Недостатки: вам все равно нужно явно включать \n для строк новой строки, и мне не нравится потерять возможность отступать от моего кода красиво и красиво. Синтаксис HEREDOC также страдает от этой функции, поэтому, возможно, это вас не беспокоит.
Лично это не синтаксис, который мне нравится.
Если я правильно вас понимаю, я считаю, что вам нужно это:
#include <iostream>
...
std::cout << std::endl << "yadayadayada" << std::endl;