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



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

960   3  

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

если вы хотите смешать a #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 processor работает, поэтому вам нужно два уровня макроса, чтобы получить фактическое значение 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;
}

Comments

    Ничего не найдено.