Передача констант в 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()
,