在 Windows 下将 C++ 程序从 32 位移植到 64 位时,我意识到不支持 _tcslen,而应该使用 strlen/wcslen(用于非 unicode/unicode)。我开始怀疑
3 回答
- 是的。21.4 节中的表 48 给出
wcslen
了在 中声明的函数之一<cwchar>
。 _tcslen
在进行 x64 构建时也可用。- 只要
_UNICODE
被定义然后_tcslen
扩展为wcslen
。通过使用您获得的唯一好处_tcslen
是,理论上您可以通过拨动开关来构建应用程序的 ANSI 版本;实际上,您不会从中获得任何好处(2012 年的 ANSI 构建简直是残暴的恕我直言),并且需要实际工作才能使您的构建双向工作。我不会推荐它。
其他人已经回答了您的第一个问题(答案是“是”),所以我将回答其他两个问题:
2) _tcslen 与 Win64 完美兼容。
3)如果您处理一些值字符串(例如or )但您没有定义,那么使用wcslen
而不是是错误的。如果未定义,则扩展为so is - 不能传递给. 所以编译器会出错。_tcslen
TCHAR
LPTSTR
LPCTSTR
_UNICODE
_UNICODE
TCHAR
char
LPTSTR
char*
wcslen
有关_tcslen 扩展到什么的讨论,请参阅MSDN 页面上 strlen/wcslen/...的备注部分。
ISO/IEC 14882:2003(E), Ch. 21,表 48,p。412.wcslen()
确实是标准的一部分,由 提出#include <cwchar>
。
该标准没有提及tcslen()
或_tcslen()
。这些似乎是 Microsoft 扩展。如果它们与您的目标平台不兼容并且标准中未提及,则最好坚持使用wcslen()
.
参考:以下划线开头的符号通常代表实现细节。通过tcslen
以下划线开头,您的工具链的开发人员可能会警告您,这_tcslen()
可能会在未来的版本中消失。看来这正是发生在你身上的事情。
当我没有好的选择时,我也会偶尔使用下划线的功能;但是每当我更改工具链时,我都必须更新我的代码。因此,通常情况下,标准是最好的。
祝你好运。