2

在 Windows 下将 C++ 程序从 32 位移植到 64 位时,我意识到不支持 _tcslen,而应该使用 strlen/wcslen(用于非 unicode/unicode)。我开始怀疑

  1. 如果 wcslen 是 ISO/IEC 14882:2003 C++ 标准库的一部分。我看到 g++ 和 VC++ 都支持这个函数。同样在公开组中,我发现了一个参考说明,The functionality described on this reference page is aligned with the ISO C standard但没有提及它是 C89 还是 c99。
  2. _tcslen 是否与 Win64 不兼容?甚至MSDN Link也没有暗示任何事情。
  3. 对于 Unicode,是否可以不经意地使用 wcslen 而不是 _tcslen?
4

3 回答 3

3
  1. 是的。21.4 节中的表 48 给出wcslen了在 中声明的函数之一<cwchar>
  2. _tcslen在进行 x64 构建时也可用。
  3. 只要_UNICODE被定义然后_tcslen扩展为wcslen。通过使用您获得的唯一好处_tcslen是,理论上您可以通过拨动开关来构建应用程序的 ANSI 版本;实际上,您不会从中获得任何好处(2012 年的 ANSI 构建简直是残暴的恕我直言),并且需要实际工作才能使您的构建双向工作。我不会推荐它。
于 2012-04-26T11:41:05.663 回答
2

其他人已经回答了您的第一个问题(答案是“是”),所以我将回答其他两个问题:

2) _tcslen 与 Win64 完美兼容。

3)如果您处理一些值字符串(例如or )但您没有定义,那么使用wcslen而不是是错误的。如果未定义,则扩展为so is - 不能传递给. 所以编译器会出错。_tcslenTCHARLPTSTRLPCTSTR_UNICODE_UNICODETCHARcharLPTSTRchar*wcslen

有关_tcslen 扩展到什么的讨论,请参阅MSDN 页面上 strlen/wcslen/...的备注部分。

于 2012-04-26T11:45:39.990 回答
1

ISO/IEC 14882:2003(E), Ch. 21,表 48,p。412.wcslen()确实是标准的一部分,由 提出#include <cwchar>

该标准没有提及tcslen()_tcslen()。这些似乎是 Microsoft 扩展。如果它们与您的目标平台不兼容并且标准中未提及,则最好坚持使用wcslen().

参考:以下划线开头的符号通常代表实现细节。通过tcslen以下划线开头,您的工具链的开发人员可能会警告您,这_tcslen()可能会在未来的版本中消失。看来这正是发生在你身上的事情。

当我没有好的选择时,我也会偶尔使用下划线的功能;但是每当我更改工具链时,我都必须更新我的代码。因此,通常情况下,标准是最好的。

祝你好运。

于 2012-04-26T11:41:10.383 回答