_tcslen和_tcsclen有什么区别?

What is the difference between _tcslen and _tcsclen?

本文关键字:区别 什么 tcsclen tcslen      更新时间:2023-10-16

>我开发了一个应用程序,它必须与不同的字符集编码兼容。为此,我总是使用TCHAR*而不是char*来定义字符串。因此,我使用_tcslen来获取字符串的大小。

今天,我在公司的版本控制系统上看到,我的一位同事编辑了我写_tcslen的行,改用_tcsclen

我发现唯一在谈论这个函数的特殊性的链接是这个,它没有解释这些功能之间的区别。

有人可以解释我_tcslen_tcsclen之间的区别吗?

_t前缀意味着这些是映射到不同实现的文本处理函数(实际上是宏),具体取决于您是否针对"Unicode"(实际上是 UTF-16)进行编译。

当您为 Unicode(_UNICODE已设置)进行编译时,它们映射到相同的函数wcslen,该函数以宽(双字节)字符返回字符串的长度。

当您不针对 Unicode 进行编译(_MBCS已设置)时,它们映射到不同的函数:

  • _tcslen映射到strlen,后者返回字符串的长度(以字节为单位)。这样做的目的是您可以分配正确大小的缓冲区。
  • _tcsclen映射到_mbslen,其文档相当稀少。然而,我_tcsclen中的c是意
  • 味人物。

字符和字节之间的区别在于,在多字节编码中,特定字符可以占用一到三个字节。因此:_tcsclen(_mbslen)告诉您字符串中有多少个字符,这对于渲染很有用,_tcslen(strlen)告诉您字符串中有多少字节,您需要分配内存。

一般来说,如果你主要在Windows上工作,你只需要为Unicode编译并完成它。如果您正在与另一个系统通信(读取/写入文件、网络消息等),则只需要处理其他字符编码,并且通常会在 UTF-8 之间进行转换。

请注意,当 Windows SDK 文档提到"多字节"时,它指的是较旧的多字节编码,例如 Shift-JIS,而不是 UTF-8(这也是一种多字节编码)。

设置 Windows_MBCS编译器标志时,_tcslen映射到 strlen,_tcsclen映射到_mbslen。设置 Windows_UNICODE标志时,泛型函数都映射到 wcslen。