Разделение строк 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::stringappend() метод, но мне было интересно, есть ли какой-нибудь более короткий / более элегантный (например, более похожий на 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;
}

Если вы хотите смешать #defined целочисленная константа в литерал, вам придется использовать несколько макросов:

#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;
}
Другие вопросы по тегам