wcslen 是 ISO/IEC 14882:2003 C++标准库的一部分吗?

Is wcslen part of the ISO/IEC 14882:2003 C++ standard library?

本文关键字:标准 一部分 C++ 2003 ISO IEC 14882 wcslen      更新时间:2023-10-16

在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 链接也没有暗示任何事情。
  3. 对于Unicode,是否可以无意中使用wcslen而不是_tcslen?
  1. 是的,它是。第 21.4 节中的表 48 给出了 wcslen 作为 <cwchar> 中声明的函数之一。
  2. 执行 x64 生成时也可用_tcslen
  3. 只要定义了_UNICODE_tcslen就会扩展到wcslen。使用_tcslen获得的唯一好处是,从理论上讲,您可以通过拨动开关来构建应用程序的ANSI;实际上,您不会从中获得任何好处(恕我直言,2012 年的 ANSI 构建简直是残暴的),并且需要实际工作才能使您的构建双向工作。我不会推荐它。

其他人已经回答了你的第一个问题(答案是"是"),所以我将回答另外两个问题:

2)_tcslen与Win64完全兼容。

3)_tcslen wcslen如果您处理一些TCHAR值字符串(例如 LPTSTRLPCTSTR),但您没有定义_UNICODE。如果未定义_UNICODETCHAR将扩展到char以便LPTSTR char* - 不能传递给wcslen。所以编译器barfs。

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

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

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

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

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

祝你好运。