1

プロジェクトを gcc に移植するための LPWSTR の代わりを見つけようとしています。

typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;

null 終端とは何ですか? 私がこのようなことをした場合、それは安全でしょうか:

typedef WCHAR   *LPWSTR 
4

1 に答える 1

6

typedef __nullterminated WCHAR *NWPSTR、*LPWSTR、*PWSTR;

その__nullterminated部分はSAL アノテーションです。SAL は、関数のパラメーター、戻り値、関数の動作などに注釈を付けてバグを見つけ、Visual Studio コード分析ツールを使用して C/C++ コードの欠陥を減らす Microsoft 固有のテクノロジです。MSDN で SAL について読むことができます。

SAL 注釈を使用して C/C++ コードの欠陥を減らす

WCHARは、Windows プラットフォーム SDK ヘッダーで基本的に の typedef として定義されていますwchar_t。これは、Microsoft Visual C++ コンパイラの16 ビット文字型です。これは、Windows APIのデフォルトの事実上のUnicode エンコーディングであるUnicode UTF-16エンコーディングの「文字単位」として使用されます。 Linux 上の GNU GCC などの他のコンパイラは32 ビット文字単位 ( 16 ビットではありません) と見なすため、コードの移植性についてここで注意を払う必要があることに注意してください。
wchar_t

(注: 最近のバージョンの Windows は、いわゆるサロゲート ペアで Unicode UTF-16 をサポートしているため、サロゲート ペアを定義するいくつかの隣接するを使用できます。)WCHAR

NWPSTRLPWSTRおよびPWSTRはすべて同義語であり、へのポインターWCHARとして定義されます。つまり、__nullterminatedSAL 注釈も考慮すると、これらは「生の」 C スタイルの NUL で終了する Unicode UTF-16 文字列へのポインターです。

基本的に、これは従来の C に相当する Windows Win32 Unicode ですchar*

私は数年間 C++ で Windows をプログラミングしてきましたが、NWPSTR正直なところ、これに出会ったことはありません :)

名前PWSTRは、次の要素を使用して作成されます。

  • P: ポインター
  • W: "wide"、つまりWCHAR/wchar_tベース、つまり Unicode UTF-16
  • STR: ストリング

つまり、既に上で述べたように、 /文字列、つまり Unicode UTF-16 文字列PWSTRへのポインタを意味します。WCHARwchar_t

LPWSTR同じものの古い名前です。最初L「長い」という意味で、「短い」または「近い」ポインターよりも遠くにメモリにアクセスできる「長いポインター」があった時代にさかのぼります:)それらの日はもうありません。

そして、これらの名前に a を入れると、対応Cする読み取り専用の typedef がありますconst。たとえば、PCWSTRまたはLPCWSTR基本的にconst wchar_t*NUL で終了する Unicode UTF-16 文字列です。

Unicode UTF-16 の「入力」 (つまり) C スタイルの NUL 終了文字列を表すために、Windows ヘッダー ファイルと Windows API ドキュメントでPCWSTR、古い同等のものが多くLPCWSTR使用されていることがわかります。 const

于 2015-01-28T23:34:17.923 に答える