質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

Q&A

解決済

2回答

940閲覧

(LPSTR)(LPCTSTR)A 型変更について

ggga

総合スコア4

VC++

VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

0グッド

0クリップ

投稿2022/10/24 07:35

(LPSTR)(LPCTSTR)A

上記のコードで、Aにはファイルのパスが文字列として格納されています。それをLPCTSTR(const TCHAR)からLPSTR(char✳︎)へと型をキャストしている意味が分かりません。予想でもいいので分かる方いらっしゃればお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2022/10/24 08:10

変数Aの型はなんでしょうか?(MFCでのCStringAなど?) また可能であれば、実際のコード、またはコードの出典を記載ください。
ggga

2022/10/24 08:14

ご返信ありがとうございます。変数AはCstring型でした。
ggga

2022/10/24 08:17

環境はvisual studioです。
can110

2022/10/24 08:27

キャストした結果値をどのように利用しているかが分かるコード部分を提示ください。 (LVITEM構造体のメンバpszTextに代入しているようなコードなど)
cx20

2022/10/24 09:39

ggga さん> 先日の回答のコメントに少し追記しているのですが、無理やりキャストしているように思います。 https://teratail.com/questions/12ljxqy3oml7jk#reply-nsb7dmimkzl4nt > CString だとすると、(LPSTR)(LPCTSTR) は、悪手に思います。 > コードの前後を見ないとハッキリとしたことは言えないですが、 > 恐らく、コンパイルエラーを解消する為に無理やりキャストしているのでしょう。 もう少し前後のコードが無いと判断が付かないので可能であれば提示願います。 あと、Unicode ビルドなのか否かも確認した方が良いと思います。Unicode ビルドである場合、恐らく、最初の1文字しか表示されないといった事象になるかと思います。
guest

回答2

0

利用コードはエスパーしての回答となります。

LPCSTR, LPCTSTR and LPTSTRの回答と近いですが

  • 非constなTCHAR配列へのポインタを要求しているが、CStringでGetBufferするのが面倒くさかった。
  • しかも呼出先では実質constとして扱う(書込みしない)はずだしこれまで問題なかった。
  • それに今後このコードはUNICODEビルドなんて絶対しないから、Tをつけなくてもいいだろう。

といった理由だと思います(でも大丈夫だろうか?)

なお、リストコントロールなどMFCでのconst外し技について考察している過去記事とMFCソースも参考としてあげておきます。

(Visual C++)CStringをLPTSTRにキャストしてはいけない理由。

(おそらく) よって、この場合はLPTSTRにキャストしても良い場合である。 事実MFCのCListCtrl::SetItem関数でもconstを外している。

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfc\winctrl2.cpp

C++

1BOOL CListCtrl::SetItem(int nItem, int nSubItem, UINT nMask, LPCTSTR lpszItem, 2 int nImage, UINT nState, UINT nStateMask, LPARAM lParam, int nIndent) 3{ 4 ASSERT(::IsWindow(m_hWnd)); 5 ASSERT((GetStyle() & LVS_OWNERDATA)==0); 6 7 LVITEM lvi; 8 lvi.mask = nMask; 9 lvi.iItem = nItem; 10 lvi.iSubItem = nSubItem; 11 lvi.stateMask = nStateMask; 12 lvi.state = nState; 13 lvi.pszText = (LPTSTR) lpszItem;

投稿2022/10/24 08:34

編集2022/10/24 09:06
can110

総合スコア38352

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

それをLPCTSTR(const TCHAR)からLPSTR(char✳︎)へと型をキャストしている意味が分かりません。

わからなくて正解です。

(受ける側の関数が、ポインタとして与えられる文字列を変更しないのにもかかわらずconstがない、という状況を除いて)このような、constを外す操作そのものが適切ではありません

EXP05-C. const 修飾をキャストではずさない

投稿2022/10/24 08:30

maisumakun

総合スコア146550

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ggga

2022/10/24 09:49

一番納得しました。ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問