2

WindowsでC++プログラムを32ビットから64ビットに移植しているときに、_tcslenはサポートされておらず、代わりにstrlen / wcslen(非Unicode / unicodeの場合)を使用する必要があることに気付きました。私は疑問に思い始めました

  1. wcslenがISO/IEC 14882:2003C++標準ライブラリの一部である場合。この関数はg++とVC++の両方でサポートされているようです。また、オープングループで私は言及している参考文献を見つけましたThe functionality described on this reference page is aligned with the ISO C standardが、そのC89またはc99のどちらであるかについては言及しませんでした。
  2. _tcslenがWin64と互換性がないことがどこかに文書化されていますか?MSDNリンクでさえ何も示唆していません。
  3. Unicodeの場合、_tcslenの代わりにwcslenを誤って使用できますか?
4

3 に答える 3

3
  1. はい、そうです。セクション21.4の表48は、でwcslen宣言された関数の1つとして示しています<cwchar>
  2. _tcslenx64ビルドを実行するときにも使用できます。
  3. _UNICODE定義されている限り、に_tcslen展開されwcslenます。使用することで得られる唯一のこと_tcslenは、理論的には、スイッチを切り替えることでアプリケーションのANSIビルドを作成できることです。実際には、これから得られるものは何もありません(2012年のANSIビルドは、単にひどいIMHOです)。ビルドを双方向で機能させるには、実際の作業が必要です。私はそれをお勧めしません。
于 2012-04-26T11:41:05.663 に答える
2

他の人はあなたの最初の質問にすでに答えています(それに対する答えは「はい」です)ので、私は他の2つの質問に答えます:

2)_tcslenはWin64と完全に互換性があります。

3)値の文字列(または)を処理するが、定義していない場合は、wcslen代わりに使用するのは誤りです。が定義されていない場合は、に展開されます。これはに渡すことはできません。したがって、コンパイラはbarfsします。_tcslenTCHARLPTSTRLPCTSTR_UNICODE_UNICODETCHARcharLPTSTRchar*wcslen

_tcslenが何に拡張されるかについての議論については、strlen / wcslen/...のMSDNページの備考セクションを参照してください。

于 2012-04-26T11:45:39.990 に答える
1

ISO / IEC 14882:2003(E)、Ch。21、表48、p。412.wcslen()は確かに標準の一部であり、によって提示され#include <cwchar>ます。

tcslen()標準では、またはについては言及されていません_tcslen()。これらはMicrosoftの拡張機能のようです。それらがターゲットプラットフォームと互換性がなく、標準に記載されていない場合は、を使用することをお勧めしwcslen()ます。

詳細情報:アンダースコアで始まる記号は、通常、実装の詳細を表します。アンダースコアを前に付けることで、ツールチェーンの開発者はおそらく、将来のバージョンで消える可能性がtcslenあることを警告しています。_tcslen()そして、これはまさにあなたに起こったことのようです。

適切な代替手段がない場合は、下線付きの機能を使用することもあります。ただし、ツールチェーンを変更するたびにコードを更新する必要があります。したがって、通常は標準が最適です。

幸運を。

于 2012-04-26T11:41:10.383 に答える