第16回 エンバカデロ・デベロッパーキャンプ バーチャル(一日目)で喋ってきた。(の続き)

セッションの資料とサンプルコードがアップされました。興味がある方は参考にしてください。

で、富永さんのセッション(1E)とおいらのセッション(1B)でAnsiStringからUnicodeStringへの移行に微妙に差異が。

C++Builderの場合、AnsiStrings.hppをインクルードすれば"暗黙的型変換"が発生せずに、最優先でAnsiStringを引数にもつバージョンが呼ばれる*1。UnicodeStringへの参照を求めていてもAnsiStringへの参照を渡した場合には型変換が出来ずにコンパイルエラーが発生する。その例として、SelectDirectory関数を挙げた。 constへの参照やAnsiStringそのものを渡した場合は"暗黙的型変換"によってUnicodeStringな一時オブジェクトが生成されるし、文字列本体のポインタが欲しい場合はt_str/c_strメソッドで明示的に行わなければいけない*2から、その辺は安全なはず。

もちろん、C++Builder2009以降では極力UnicodeStringを使うのがベストなのだけど、台本を確認したら言及していなかった。orz

*1:はずだよね?でないと文法的におかしいはず。

*2:ただし、TCHARのマッピングがcharの場合、UnicodeString::t_strの使用は文字列を破壊してしまう可能性があるので要注意。てか、お仕事で小一時間ほどハマって急遽プレゼンに追加w