奈良県でソフトウェア開発・Webサイトの運営をしているフリーランスのエンジニアです

ロジカルアーツ研究所

C++Builder

C++Builder XE3ではt_str()を使ってはいけない

投稿日:2012年12月6日 更新日:

C++Builder 2009以降アップデートしてなかったので、正確にはいつから変わったのかわからないんですが、XE3ではUnicodeString型のt_str()メソッドの仕様が変更され、非推奨となっていることに気づきました。

今までは、プロジェクトオプションの「_TCHARのマップ先」の設定に応じて、char*あるいはwchar_t*のポインタを自動的に返してくれたのですが、XE3では「_TCHARのマップ先」の設定にかかわらず、常にwchar_t*のポインタを返すようになりました。つまり、動作としてはc_str()と同じです。

これまでt_str()が便利だったので、かなり多用してきましたが、それを全部書き換えなければならなくなりました。もちろん、wchar_t*のポインタを受け取らないような関数ではコンパイルエラーになるので発見できますが、そうでない場合は発見が難しくなります。コンパイルエラーにならないケースでt_str()を使っていると、文字列が途中で切れてしまうような不具合が起こり得ます。これからは

UnicodeString str = "ABCDE";
char buf[256];
// strcpy(buf, str.t_str());
// ↓のように書き換え
strcpy(buf, AnsiString(str).c_str());

のように、いったんAnsiString型に変換してからc_str()を使わなければなりません。

t_str()が便利だったのに、なぜわざわざこんな仕様変更をしたのか不明です。

-C++Builder

Copyright© ロジカルアーツ研究所 , 2024 All Rights Reserved Powered by STINGER.