Я работаю над кодовой базой C++, которая снабжена исходными файлами некоторых библиотек, и мне запрещено нарушать некоторые рекомендации или изменять логику и парадигмы библиотеки, например, мне не разрешено использовать файлы ресурсов.
в исходных файлах кодовой базы есть случай, когда использовался очень длинный необработанный строковый литерал, как показано ниже.
constexpr auto kImGuiWS_js = R"(
very long multiline string about 18000 characters
)";
и это вызывает некоторые осложнения, например, я получаю следующую ошибку при использовании компилятора MSVC
Error C2026 string too big, trailing characters truncated
о чем свидетельствуют документы
Прежде чем соседние строки будут объединены, строка не может быть длиннее. более 16380 однобайтовых символов.
также существует аккуратное неинвазивное решение, позволяющее компилировать обычный длинный строковый литерал без изменения логики кода.
char sz[] =
"\
imagine a really, really "
"long string here\
";
но, похоже, это невозможно для необработанных строковых литералов, существуют ли какие-либо обходные пути, которые могли бы сохранить эту структуру кода и позволить мне предотвратить ошибки компилятора, связанные с превышением максимальной длины длинного строкового литерала?
Подход, используемый js2c , заключается в использовании инициализатора массива символов. Кажется, у него более высокий предел. Источник: один из комментариев или этот ответ
@Botje: такое разделение также работает с Msvc.
@Botje, поскольку твой ответ был правильным, и ты упомянул об этом перед всеми, я буду ждать, пока ты примешь его
Незачем. это не соревнование.
но, похоже, это невозможно для необработанных строковых литералов
Это:
const char *foo = R"(abc)" R"(def)";
const char *foo = R"(abc)" R"(def)";
компилируется на GCC и Clang. Не на MSVC, я так понимаю?