teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

CStringのキャストについて追記

2020/02/14 09:00

投稿

dodox86
dodox86

スコア9416

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