【问题标题】:Is wcslen part of the ISO/IEC 14882:2003 C++ standard library?wcslen 是 ISO/IEC 14882:2003 C++ 标准库的一部分吗?
【发布时间】:2012-04-26 11:34:32
【问题描述】:

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

  1. 如果 wcslen 是 ISO/IEC 14882:2003 C++ 标准库的一部分。我看到 g++ 和 VC++ 都支持这个函数。同样在open group 中,我找到了一个说明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?

【问题讨论】:

  • _tcslen 只是wcslenstrlen 的#define,具体取决于是否定义了_UNICODE。您可以随时复制 tchar.h 或制作您自己的版本以使其在任何平台上工作。如果它不起作用,您可能只需要包含 tchar.h。

标签: c++ windows linux 64-bit strlen


【解决方案1】:
  1. 是的。第 21.4 节中的表 48 将 wcslen 作为 <cwchar> 中声明的函数之一。
  2. _tcslen 在进行 x64 构建时也可用。
  3. 只要定义了_UNICODE_tcslen 就会扩展为wcslen。使用_tcslen 获得的唯一好处是理论上您可以通过拨动开关来构建应用程序的 ANSI 版本; 实际上您不会从中获得任何好处(2012 年的 ANSI 构建简直是残暴的恕我直言),并且需要实际工作才能使您的构建双向工作。我不会推荐它。

【讨论】:

  • 谢谢。这回答了我的第一个问题。期待我问题的其余部分。
  • 感谢您的意见。我知道 _tcslen 如何针对 ANSI/UNICODE 进行不同的扩展。我正在查看的那段代码保证只针对 UNICODE 执行,所以我期待安全地将 _tcslen 替换为 wcslen。
【解决方案2】:

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

2) _tcslen 与 Win64 完美兼容。

3) 如果您处理一些TCHAR 值字符串(例如LPTSTRLPCTSTR)但您没有定义_UNICODE,则使用wcslen 而不是_tcslen 是错误的.如果未定义 _UNICODETCHAR 将扩展为 char,因此 LPTSTRchar* - 不能传递给 wcslen。所以编译器会出错。

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

【讨论】:

    【解决方案3】:

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

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

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

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

    祝你好运。

    【讨论】:

    • 谢谢。这回答了我的第一个问题。期待我问题的其余部分。
    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多