2017-11-17 1 views
1

Windows C++のマルチバイト/ユニコードに関する考慮事項では、マルチバイトまたはユニコードにコンパイルするかどうかにかかわらず、_tcslen()およびlstrlen()が両方とも文字列の長さを正しく認識します。Windows C++ multibyte/unicode

_tcslen()はdef _UNICODEに基づいてTCHAR.Hで定義され、lstrlen()はdef UNICODEに基づいてWINBASE.Hで定義されます。

誰かが何らかの点でホイールを再発明しただけですか、この明らかな重複の理由がありますか?

+0

https://www.codeproject.com/Messages/2654087/Whats-the-differences-between-lstrlen-and-_tcslen.aspx –

+0

いいえ、これらは* ANSI(char)またはマルチバイト(wchar)の関数と型があります。重複はなく、 '再発明 'のマクロはANSIやUnicodeのコードをコンパイルするための90年代初頭から存在していました。 OSはWindows NTよりも前にUnicodeを使用していなかったことを覚えておいてください。 C++は2011年に 'char16_t'、' char32_t'、 'std :: u16string'、' std :: u32string'型のUnicodeを追加しました。 –

+1

いずれにしても、C++で 'lstrlen'や' _tcslen'のようなC関数と型を混ぜ合わせるべきではありません。言語の種類とアルゴリズムを使用する必要があります。 [std :: string.length()](http://www.cplusplus.com/reference/string/string/length/)または[u16string.length()](http://www.cplusplus.com/)を使用してください。参照/文字列/ u16string /)。型推論に 'auto'を使うべきです。使用すると簡単に漏れることができる生ポインタの代わりに[unique_ptr](http://en.cppreference.com/w/cpp/memory/unique_ptr)で参照とスマートポインタを渡します。ポインター算術の代わりのイテレーター –

答えて

1

lstrlenその他lstrxxxはWindows APIです。彼らはANSIとユニコードバージョンlstrlenAlstrenWを持っています。 Windows 3.1の時代には、strlen以上の利点がありました。彼らは今、何の利点もありません。これらの関数を使ってコードを書くと、Cの標準と互換性がなくなり、Windowsでのみコンパイルされます。

_tstrlenはあなたが1つのWindows 95用のANSIでコンパイルすることができ、コードのセット、およびUnicodeを書くことができますので、標準C.これは、1990年代と2000年代初頭に有用であったされているANSIまたはUnicode strlenwcslenのいずれかのためのマクロですWindows NT。 MicrosoftがANSIとUnicodeの両方のドキュメントを作成できるので便利です。

これ以外の場合、これらの_tstrxxx文字列マクロとTCHARなどはもはや役に立ちません。 Windows 95と互換性のあるコードを書くために、この苦痛を経験する必要はありません。標準的な "ワイドC文字列" wcsxxx関数を使用することができます。

しかし、* nixオペレーティングシステムでは、 UTF-8およびstrxxx機能UTF-16とwcsxxxを使用するWindowsとは対照的です。あなたは、* nixとWindowsの両方でUnicode互換のコードを書くために_tstrxxxマクロを使うことができると思います。他のプログラマはあなたの_tstrxxxマクロで混乱しますが、少なくともコードはコンパイルするより良い機会です!

+0

私がこれらの二重使用マクロを使用しているのは、マルチバイトに構築された〜1000個のDLLを含むWindowsのC++プロジェクトに新しいDLLを追加するためです。私のDLLは将来、Unicodeプロジェクトで再利用されるかもしれません。 –