プロジェクトを gcc に移植するための LPWSTR の代わりを見つけようとしています。
typedef __nullterminated WCHAR *NWPSTR, *LPWSTR, *PWSTR;
null 終端とは何ですか? 私がこのようなことをした場合、それは安全でしょうか:
typedef WCHAR *LPWSTR
typedef __nullterminated WCHAR *NWPSTR、*LPWSTR、*PWSTR;
その__nullterminated
部分はSAL アノテーションです。SAL は、関数のパラメーター、戻り値、関数の動作などに注釈を付けてバグを見つけ、Visual Studio コード分析ツールを使用して C/C++ コードの欠陥を減らす Microsoft 固有のテクノロジです。MSDN で SAL について読むことができます。
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
NWPSTR
、LPWSTR
およびPWSTR
はすべて同義語であり、へのポインターWCHAR
として定義されます。つまり、__nullterminated
SAL 注釈も考慮すると、これらは「生の」 C スタイルの NUL で終了する Unicode UTF-16 文字列へのポインターです。
基本的に、これは従来の C に相当する Windows Win32 Unicode ですchar*
。
私は数年間 C++ で Windows をプログラミングしてきましたが、NWPSTR
正直なところ、これに出会ったことはありません :)
名前PWSTR
は、次の要素を使用して作成されます。
P
: ポインターW
: "wide"、つまりWCHAR
/wchar_t
ベース、つまり Unicode UTF-16STR
: ストリングつまり、既に上で述べたように、 /文字列、つまり Unicode UTF-16 文字列PWSTR
へのポインタを意味します。WCHAR
wchar_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