_tcslen和_tcsclen有什么区别?
What is the difference between _tcslen and _tcsclen?
>我开发了一个应用程序,它必须与不同的字符集编码兼容。为此,我总是使用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。
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::vector和llvm::SmallVector之间有什么区别?什么时候用哪一个