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

时间:2012-04-26 11:34:32

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

在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吗?

3 个答案:

答案 0 :(得分:3)

  1. 是的。第21.4节中的表48将wcslen作为<cwchar>中声明的函数之一。
  2. 在进行x64构建时,
  3. _tcslen也可用。
  4. 只要定义了_UNICODE_tcslen就会扩展为wcslen。使用_tcslen获得的唯一好处是理论上您可以通过翻转开关来构建应用程序的ANSI版本; 几乎你没有任何东西可以从中获益(2012年的ANSI构建简直是骇人听闻的恕我直言)而且需要实际的工作才能使你的构建双向工作。我不推荐它。

答案 1 :(得分:2)

其他人已经回答了你的第一个问题(答案是肯定的。),所以我会回答其他两个问题:

2)_tcslen与Win64完全兼容。

3)如果您处理一些wcslen值字符串(例如_tcslenTCHAR),则使用LPTSTR代替LPCTSTR是错误的但是你没有定义_UNICODE。如果未定义_UNICODE,则TCHAR会扩展为char,因此LPTSTRchar* - 无法传递给wcslen。所以编译器barfs。

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

答案 2 :(得分:1)

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

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

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

当我没有一个好的选择时,我偶尔会使用强调功能;但是每当我更换工具链时我都必须更新我的代码。所以,通常,标准是最好的。

祝你好运。