トップページ > 記事閲覧
c++20でのu8リテラル
名前:yyssxx 日時: 2025/01/29 10:38

環境: Visual studio 2022 Pro DXLIB Ver 3.24 C++にて開発 C++20のモジュールなどの新機能を使いたいと思い、 プロジェクトのC++のVersionをc++20にしたところ文字列関係で一斉にエラーになりました。 以下のエラーになります。  型 "const char8_t *" の引数は型 "const TCHAR *" のパラメーターと互換性がありません c++20追加されたUTF-8用のchar8_t と TCHAR が互換性が無いためと思われますが、 c++20を使いたい場合は明示的にキャストするしか方法は無いでしょうか? ANSI(shift-JIS)にすればエラーは出なくなるのですが、 Steamで公開したいため、UTF-8にしないと海外側で文字化けに悩まされてしまいます。 SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 ); でUTF-8の設定はしています。 あと、 SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 )を使う場合は プロジェクトの文字セットを ・Unicode 文字セットを使用する にしたほうがいいのでしょうか? 今のところ「マルチ バイト文字セット」でも動いています。
メンテ

Page: 1 |

Re: c++20でのu8リテラル ( No.1 )
名前:yyssxx 日時:2025/01/29 11:00

色々試しましたがconst char*にキャストすれば行けました。 Cスタイルキャストなら危ないけど短くて済みますが、reinterpret_castだと結構長くなるのが懸念・・・ // これはOK DrawString( 0, 0, (TCHAR*)u8"abc123あいうえお", 0xffffff ); // これもOK DrawString( 0, 20, (const char*)u8"abc123あいうえお", 0xffffff ); // これだとエラー:'reinterpret_cast': 'const char8_t [22]' から 'TCHAR *' に変換できません。 DrawString( 0, 100, reinterpret_cast<TCHAR*>( u8"abc123あいうえお" ), 0xffffff ); // これならOK DrawString( 0, 120, reinterpret_cast<const char*>( u8"abc123あいうえお" ), 0xffffff ); // これだとエラー:無効な型変換です DrawString( 0, 200, static_cast<TCHAR*>( u8"aaaaあいうえお" ), 0xffffff ); // これだとエラー:無効な型変換です DrawString( 0, 220, static_cast<const char*>( u8"aaaaあいうえお" ), 0xffffff );
メンテ
Re: c++20でのu8リテラル ( No.2 )
名前:管理人 日時:2025/01/30 00:16

> c++20追加されたUTF-8用のchar8_t と TCHAR が互換性が無いためと思われますが、 > c++20を使いたい場合は明示的にキャストするしか方法は無いでしょうか? はい、現状ではそうなります 『DXライブラリが扱う文字形式を char8_t のみにする』等の仕様変更を行わない限りは キャストしていただくしかありません m(_ _;m > SetUseCharCodeFormat( DX_CHARCODEFORMAT_UTF8 )を使う場合は > プロジェクトの文字セットを > ・Unicode 文字セットを使用する > にしたほうがいいのでしょうか? > 今のところ「マルチ バイト文字セット」でも動いています。 いえ、UTF-8 を使用する場合は『マルチ バイト文字セット』に設定する必要があります ( プロジェクトの文字セットを Unicode にした場合は文字形式は UTF-16LE で固定されますので )
メンテ
Re: c++20でのu8リテラル ( No.3 )
名前:yyssxx(解決) 日時:2025/02/02 21:54

ご返信ありがとうございます。 やっぱりキャストするしかありませんでしたか・・・ 既存のソースは地道にキャストするよう修正するようにしたいと思います。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存