在Windows下将C ++程序从32位移植到64位时我意识到_tcslen不受支持,而应该使用strlen / wcslen(对于非unicode / unicode)。我开始怀疑
The functionality described on this reference page is aligned with the ISO C standard
的引用,但未提及它的C89或c99。答案 0 :(得分:3)
wcslen
作为<cwchar>
中声明的函数之一。_tcslen
也可用。_UNICODE
,_tcslen
就会扩展为wcslen
。使用_tcslen
获得的唯一好处是理论上您可以通过翻转开关来构建应用程序的ANSI版本; 几乎你没有任何东西可以从中获益(2012年的ANSI构建简直是骇人听闻的恕我直言)而且需要实际的工作才能使你的构建双向工作。我不推荐它。答案 1 :(得分:2)
其他人已经回答了你的第一个问题(答案是肯定的。),所以我会回答其他两个问题:
2)_tcslen与Win64完全兼容。
3)如果您处理一些wcslen
值字符串(例如_tcslen
或TCHAR
),则使用LPTSTR
代替LPCTSTR
是错误的但是你没有定义_UNICODE
。如果未定义_UNICODE
,则TCHAR
会扩展为char
,因此LPTSTR
为char*
- 无法传递给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()
可能会在将来的版本中消失。看来这正是发生在你身上的事情。
当我没有一个好的选择时,我偶尔会使用强调功能;但是每当我更换工具链时我都必须更新我的代码。所以,通常,标准是最好的。
祝你好运。