Передача констант в TIniFile.ReadString

Должен ли я использовать L каждый раз, когда я передаю значение cosntant в ReadString?

s = MyIni->ReadString (L"ü", L"SomeEntry", "");

Пример Embarcadero не говорит об этом, но они также не используют символы не ASCII в их примере.

1 ответ

Решение

В C++Builder 2009 и более поздних версиях весь RTL основан на System::UnicodeString скорее, чем System::AnsiString, С использованием L префикс говорит компилятору создать широкий строковый литерал (основанный на wchar_t) вместо узкого строкового литерала (на основе char).

Пока вы не должны использовать префикс L, вы ДОЛЖНЫ использовать его, потому что он вызывает меньше накладных расходов во время выполнения. На Windows, построение UnicodeString из wchar_t Строка является простой копией памяти, в то время как конструирование ее из char строка выполняет преобразование данных (используя System::DefaultSystemCodePage переменная как кодовая страница, используемая для преобразования). Это преобразование МОЖЕТ быть потерянным для символов, не относящихся к ASCII, в зависимости от кодировки узкой строки, которая зависит от набора символов, в котором вы сохраняете исходный файл, а также от набора символов, используемого компилятором при синтаксическом анализе исходного файла. Таким образом, нет никакой гарантии, что то, что вы напишите в коде в узком строковом литерале, это то, что вы фактически получите во время выполнения. Использование широкого строкового литерала позволяет избежать этой двусмысленности.

Обратите внимание, что UnicodeString кодируется UTF-16 на всех платформах, но wchar_t используется для UTF-16 только в Windows, где wchar_t это 16-битный тип данных. На других платформах, где wchar_t обычно это 32-битный тип данных, используемый для UTF-32, char16_t используется вместо Таким образом, если вам нужно написать переносимый код, используйте RTL _D() макрос вместо использования L префикс непосредственно, например:

s = MyIni->ReadString(_D("ü"), _D("SomeEntry"), _D(""));

_D() отобразит строковый / символьный литерал в правильный тип данных (wchar_t или же char16_tв зависимости от платформы, для которой вы компилируете). Таким образом, при использовании строковых / символьных литералов с библиотеками RTL, VCL и FMX вы должны всегда иметь привычку использовать _D(),

Другие вопросы по тегам