Разделение строк С++ на несколько строк (синтаксис кода, не анализ)

Не следует путать с тем, как разбить синтаксический анализ строки, например:
Разделить строку на С++?

Я немного смущен, как разбить строку на несколько строк в С++.

Это звучит как простой вопрос, но возьмите следующий пример:

#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(), но мне было интересно, есть ли более короткие/более элегантные (например, более питонно, хотя, очевидно, тройные кавычки и т.д. не поддерживаются в С++), путь к разбить строки в С++ на несколько строк для удобства чтения.

Одно место, где это было бы особенно желательно, - это когда вы передаете длинные строковые литералы в функцию (например, предложение).

Ответ 1

Не помещайте ничего между строками. Часть этапа лексики С++ состоит в объединении смежных строковых литералов (даже над новыми строками и комментариями) в один литерал.

#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 integer в литерал, вам нужно будет использовать некоторые макросы:

#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;
}

Там какая-то странность из-за того, как работает оператор стробирования процессора, поэтому вам нужно два уровня макроса, чтобы получить фактическое значение TWO для преобразования в строковый литерал.

Ответ 2

Являются ли они оба литералами? Разделение двух строковых литералов с пробелом совпадает с конкатенацией: "abc" "123" совпадает с "abc123". Это относится как к прямому C, так и к С++.

Ответ 3

Я не знаю, является ли это расширением в GCC или стандартным, но, похоже, вы можете продолжить строковый литерал, закончив строку обратным слэшем (так же, как большинство типов линий могут быть расширены в этой усадьбе в С++, например, макрос, охватывающий несколько строк).

#include <iostream>
#include <string>

int main ()
{
    std::string str = "hello world\
    this seems to work";

    std::cout << str;
    return 0;
}