C、C++、Win 32とCOMの文字列を徹底的に理解する

3414 ワード

C/C++の文字列の問題はネット上の説明でずっとあいまいで、各階層のライブラリの混用、乱用の情況が存在して、特に広い文字と狭い文字などの問題は有効な資料を見つけるのが難しいので、本編のエッセイは私が長期にわたって収集したいくつかの比較的正確な材料とそれによって得た個人の理解を分かち合います.
C言語の文字列
C言語には2種類の文字タイプcharとwcharが用意されています.t,C言語は文字配列を用いて文字列を表すとともに,「abcd」とL「abcd」の2つの直接量表記をサポートし,C言語は文字列定数で文字列を初期化することができる.標準C関数ライブラリにはprintfとwprintfの2つのバージョンの出力関数があります.#include <stdio.h><br>int main(){ <br> char str[] = "abcd"; <br> wchar_t wstr[] = L"abcd "; <br> printf("%s/n",str); <br> wprintf(L"%s/n",wstr); <br> return 0; <br>}</stdio.h>
純粋なC言語環境では、2つの関数wcstombsとmbstowcsを使用して、狭い文字列の相互変換を行うことができます.次の段落は、C言語におけるwcstombsの例です.#include <stdio.h><br>#include <stdlib.h><br>int main(){ <br> char str[] = "abcd"; <br> wchar_t wstr[] = L"bcda"; <br> wcstombs(str,wstr,sizeof(str)); <br> printf("%s/n",str); <br> return 0; <br>}</stdlib.h></stdio.h>
この2つの関数は、C標準ライブラリヘッダファイルstdlibに宣言する.h中.他の文字列操作はヘッダファイルstringにあります.hとwchar.h
C++言語の文字列
C++には文字列クラスstringとwstringがあります.この2つのクラスはヘッダファイルstringの中にあります.さらにiostreamには、それぞれ対応するバージョンの出力ストリーム:#include
#include
int main(){
std::string str="abcd";
std::wstring wstrng=L"abcd";
std::cout std::wcout return 0;
}
C++での変換が容易になり、文字列を作成するときにもう一つの反復器を渡せばいい:#include
#include
int main(){
std::string str="abcd";
std::wstring wstr(str.begin()、str.end();
std::wcout return 0;
}s>既存の文字列に対してassignで値を割り当てることができます.ワイド文字には狭い文字にない文字があるので、変換ルールを指定する場合は、ヘッダファイルalgorithmのtransform関数を使用します.他の文字列関連操作もヘッダファイルstringのクラス定義にあります.
Win 32プログラミングにおける文字列
しかし,我々の実際のプログラミングでは,文字セットの問題が比較的多い場合はWin 32プログラミングである.Win 32 SDKは、コンパイラによる差異を回避するために、マクロを用いて独自のタイプシステムを定義し、文字タイプがCHARとWHARである.特に、Win 32プログラミングはコンパイル時のUnicodeと非Unicode指定をサポートするため、Win 32 SDKはまたTCHARタイプを提供し、Unicode環境かどうかに応じて自動的にCHARまたはWHARタイプを選択し、特に要求がない場合、私たちは一般的にTCHARを使うべきです.
CHARおよびWHARのそれぞれのフォント値は「abcd」およびL「abcd」であり、TCHARの対応するフォント値は_T「abcd」またはTEXT(「abcd」)である.
Win 32タイプシステムでは文字列タイプも定義されています.次の表を参照してください.
PSTR PCSTR LPSTR LPCSTR
PTSTR PCTSTR LPTSTR LPCTSTR
PWSTR PCWSTR LPWSTR LPCWSTR
ここではSTRのプレフィックスを異なる色に分け,赤色のプレフィックスはPまたはLP,Pはポインタ,LPはロングポインタを表す可能性がある.ほとんどのシステムではPとLPは同じタイプなので、この接頭辞は区別されず、64ビットC++または古い16ビットC++環境では区別される可能性があります.
青色の接頭辞はCかないかもしれませんが、これは定数ポインタかどうかを表す簡単です.
緑色接頭辞は、CHAR、WHAR、およびTCHARに対応するT、W、またはないかもしれない.
変換の問題について、Windowsは2つのAPI関数を提供しています.ここでは実際に例を挙げません.具体的にはMSDNを参照してください.
MultiByteToWideChar WideCharToMultiByte
その他これらのタイプと組み合わせたWin 32 API関数は、MSDNの参照を参照してください.
MFCのCStringタイプはこれらのAPIのパッケージを提供し、プログラミング時に使用すると多くの面倒を省くことができます.
COMの文字列
COMには、OLECHARの文字列形式であるBSTRタイプが提供されている(OLECHARは、システムのOLE文字セットに依存してWHARまたはCHARである可能性がある).多くの人は、そのマクロ定義を見たためである:typedef/*[wire_marshal]*/OLECHAR*BSTR;単純なOLECHAR*やWHAR*にすぎないと考えられていますが、そうではありません.BSTRが指すメモリアドレスの最初の数バイトも、BSTRの長さなどの情報を格納するために割り当てられた空間である.したがって、BSTRには、SysAllocString SysAllocStringByteLen SysAllocStringLen SysFreeString SysRealocString SysRealocString SysRealocStringLen SysStringByteLen SysStringLen自分が割り当てたWHAR*でこれらの関数を使用すると、問題が発生するに違いありません.同様にdeleteでBSTRを解放しようとすると、エラーも発生します.しかし、WHARに対するWin 32 APIの相当部分はBSTR上で使用することができる.