strDevName
がCStringW
(=CString
のUNICODE版)だとして、
C++
1_wprintf(L"%s%s%s", L"データ'" , (LPCWSTR)strDevName , L"'は既に存在します。\n");
2//または _wprintf(L"%s%s%s", L"データ'" , (const wchar_t*)strDevName , L"'は既に存在します。\n");
3
としてください。
追記しました:
※takabosoftさんが既にフォローの回答をしてくださっていますが、途中まで書いていたので追記として放流させていただきます。
CString型のstrDevNameをLPCWSTRにキャストすることで、情報が欠落するなどの問題などはないのですか?
この場合においては問題ありません。CString
はATL/MFCで提供されるC++のクラスですが、(LPCWSTR)
へキャストする場合のキャスト演算子のオーバーロードがされていて、(LPCWSTR)
でキャストすることで、内部で保持している文字列データへのポインターを返すようになっています。以下は、かなり昔の、Visual C++ 6.0 だった頃のCString
クラスの宣言部分抜粋です。※最近のVisual Studioに同梱のCString
クラスはC++のテンプレートで実装されていて、理解するのはもしかしたらひと苦労かもしれません。
C++
1// VC98\MFC\INCLUDE\AFX.INL, AFX.H
2class CString {
3protected:
4 LPTSTR m_pchData; // pointer to ref counted string data
5
6public:
7 operator LPCTSTR() const;
8
9 CString::operator LPCTSTR() const
10 { return m_pchData; }
11...
12}
LPCTSTR
はANSI(マルチバイト)文字ビルドではLPCSTR
に、UNICODE(ワイド)文字ビルドではLPCWSTR
に等価となります。
キャストはプログラム熟練者でないと使うなと指摘を受けたことがありまして、このケースはキャストしても情報欠落がないことを説明
既に説明されていますが、今回の場合においては情報欠落はありません。キャストした時のコンパイラからの警告と言うのは、あくまでコンパイラからの「型が違いますよ。プログラマーさん、意識は合っていますか?大丈夫ですか?」と言う警告メッセージです。コードを書いたプログラマー自身が何をやっているのか充分理解しているのであれば問題はありません。キャストをすることでコンパイラからの警告を消すことができ、これは、例えば「コンパイラさん、私は32ビットの型の変数を16ビットの型にキャストしますけど、上位16ビットは使っていないから、問題ないのです。」と言うプログラマーからコンパイラへのコードを介した意思表示です。コンパイル時の警告を消すためにキャストをするのではなく、正しい意識でキャストを伴うコードを書けば、自然とコンパイル時の警告が無くなる、と言う訳です。
※takabosoftさんが提示してくださったマイクロソフトのリンクもぜひ、併せて読んでください。(「C スタイルの文字列に関連する CString の操作方法」)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/14 07:12
2020/02/14 09:01
2020/02/14 09:06
2020/02/14 18:46
2020/02/14 18:48
2020/02/14 19:05
2020/02/15 00:15 編集
2020/02/15 01:49
2020/02/15 01:56