将常量传递给 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_t
或 char16_t
,具体取决于您正在编译的平台)。因此,在 RTL、VCL 和 FMX 库中使用 string/character 文字时,您应该养成始终使用 _D()
.
的习惯
每次我将常数传递给 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_t
或 char16_t
,具体取决于您正在编译的平台)。因此,在 RTL、VCL 和 FMX 库中使用 string/character 文字时,您应该养成始终使用 _D()
.