Разделение строк C++ на несколько строк (синтаксис кода, без разбора)
Не путать с тем, как разбить строку, например:
Разбить строку в C++?
Я немного запутался в том, как разбить строку на несколько строк в C++.
Это звучит как простой вопрос, но возьмем следующий пример:
#include <iostream>
#include <string>
main() {
//Gives error
std::string my_val ="Hello world, this is an overly long string to have" +
" on just one line";
std::cout << "My Val is : " << my_val << std::endl;
//Gives error
std::string my_val ="Hello world, this is an overly long string to have" &
" on just one line";
std::cout << "My Val is : " << my_val << std::endl;
}
Я понимаю, что я мог бы использовать std::string
append()
метод, но мне было интересно, есть ли какой-нибудь более короткий / более элегантный (например, более похожий на python, хотя очевидно, что тройные кавычки и т. д. не поддерживаются в C++), способ разбивать строки в C++ на несколько строк для удобства чтения.
Одним из мест, где это было бы особенно желательно, является передача длинных строковых литералов в функцию (например, предложение).
3 ответа
Не кладите ничего между строк. Часть этапа лексирования в C++ состоит в объединении смежных строковых литералов (даже через переводы строк и комментарии) в один литерал.
#include <iostream>
#include <string>
main() {
std::string my_val ="Hello world, this is an overly long string to have"
" on just one line";
std::cout << "My Val is : " << my_val << std::endl;
}
Обратите внимание, что если вы хотите новую строку в литерале, вам придется добавить это самостоятельно:
#include <iostream>
#include <string>
main() {
std::string my_val ="This string gets displayed over\n"
"two lines when sent to cout.";
std::cout << "My Val is : " << my_val << std::endl;
}
Если вы хотите смешать #define
d целочисленная константа в литерал, вам придется использовать несколько макросов:
#include <iostream>
using namespace std;
#define TWO 2
#define XSTRINGIFY(s) #s
#define STRINGIFY(s) XSTRINGIFY(s)
int main(int argc, char* argv[])
{
std::cout << "abc" // Outputs "abc2DEF"
STRINGIFY(TWO)
"DEF" << endl;
std::cout << "abc" // Outputs "abcTWODEF"
XSTRINGIFY(TWO)
"DEF" << endl;
}
Там есть некоторая странность из-за того, как работает оператор процессора stringify, поэтому вам нужно два уровня макросов, чтобы получить фактическое значение TWO
быть превращенным в строковый литерал.
Они оба литералы? Разделение двух строковых литералов пробелом аналогично конкатенации: "abc" "123"
такой же как "abc123"
, Это относится как к прямой C, так и к C++.
Я не знаю, является ли это расширением в GCC или стандартным, но кажется, что вы можете продолжить строковый литерал, заканчивая строку обратной косой чертой (так же, как большинство типов строк могут быть расширены в этом поместье в C++, например макрос, охватывающий несколько строк).
#include <iostream>
#include <string>
int main ()
{
std::string str = "hello world\
this seems to work";
std::cout << str;
return 0;
}