将常量传递给 TIniFile.ReadString

Passing constants to TIniFile.ReadString

每次我将常数传递给 ReadString 时是否必须使用 L

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

Embarcadero 的例子没有这么说,但他们在他们的例子中也不使用非 ASCII 字符。

在 C++Builder 2009 及更高版本中,整个 RTL 基于 System::UnicodeString 而不是 System::AnsiString。使用 L 前缀告诉编译器创建 wide 字符串文字(基于 wchar_t)而不是 narrow字符串文字(基于 char)。

虽然您不必使用前缀 L,但您应该使用它,因为它在运行时调用的开销较少。在 Windows 上,从 wchar_t 字符串构造 UnicodeString 只是简单的内存复制,而从 char 字符串构造它执行数据转换(使用 System::DefaultSystemCodePage 变量作为用于转换的代码页)。该转换 可能 对非 ASCII 字符有损,具体取决于 narrow 字符串的编码,该字符串受您保存的字符集的影响中的源文件,以及编译器在解析源文件时使用的字符集。因此,无法保证您在 narrow 字符串文字中编写的代码就是您在运行时实际获得的内容。使用 wide 字符串文字可避免歧义。

请注意,UnicodeString 在所有平台上都是 UTF-16 编码,但 wchar_t 仅在 Windows 上用于 UTF-16,其中 wchar_t 是 16位数据类型。在其他平台上,wchar_t 通常是用于 UTF-32 的 32 位数据类型,而是使用 char16_t。因此,如果您需要编写可移植代码,请使用 RTL 的 _D() 宏而不是直接使用 L 前缀,例如:

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

_D() 会将 string/character 文字映射到正确的数据类型(wchar_tchar16_t,具体取决于您正在编译的平台)。因此,在 RTL、VCL 和 FMX 库中使用 string/character 文字时,您应该养成始终使用 _D().

的习惯