ちゃっぴの監禁部屋

ガチガチに締めすぎて動きがとれなくなる。。。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  405  : 記事  5  : コメント  12114  : トラックバック  134

ニュース

記事カテゴリ

書庫

日記カテゴリ

Communities

Personal Information

2009年6月21日 #

System::String constructor」とかの絡みでいろいろ実験やっていたんですが、その時に遭遇した現象。Code はめちゃくちゃなのでその点ご了承ください。

ref class System::String 
{ 
public:
  String(signed char * buffer);
};

int main(array ^args)
{
  char str[] = "あいうえお";
  System::String ^ clrString = gcnew System::String(str);
  return 0;
}

結果は。

error C2664: 'System::String::String' : 1 番目の引数を 'char [11]' から 'signed char *' に変換できません。

んで、こんな感じにしてみると。。。

  signed char str[] = "あいうえお";

なんと。。。Microsoft(R) C/C++ Optimizing Compiler が落ちます。

問題の署名:
  問題イベント名: APPCRASH
  アプリケーション名: cl.exe
  アプリケーションのバージョン: 15.0.30729.1
  アプリケーションのタイムスタンプ: 488ef6ea
  障害モジュールの名前: c1xx.dll
  障害モジュールのバージョン: 15.0.30729.1
  障害モジュールのタイムスタンプ: 488f296d
  例外コード: c0000005
  例外オフセット: 000f4432
  OS バージョン: 6.0.6002.2.2.0.256.4
  ロケール ID: 1041

Visual Studio 2008 Professional Edition SP1 にて確認。

Compiler って落ちていいのかな。。。

posted @ 0:16 | Feedback (10)

ネタ元: System::String constructor

当初の疑問点は 2 つありました。

で、これを調査しているうちに「char と signed char」で書いたように char と signed char は compile option "/J" に関わらず別ものであるということがわかりました。理由は「charは虚数ですか?」で comment されました。

# re: charは虚数ですか? 2009/06/15 1:53 egtra

X3014:2003の3.9.1 基本型の中に「単なる文字型(char)、符号なし文字型(unsigned char)、及び符号付き文字型(signed char)は、三つの別々の型とする」という規定がありです。

なんでこんなことするんだろう?って疑問は尽きませんが。。。

で、いろいろ実験しているうちに String(signed char *) は間違いで、C++/CLI では String(char *) であるということがわかりました。

とりあえず、「String コンストラクタ (SByte*)」に書かれている内容は間違っていますね。

また、egtra さんの実験により C++/CLI では System::String(System::SByte *) もつぶされていると推測できる現象が確認できました。

ここから導き出せる結論としては、System::String constructor は C++/CLI とその他の言語で overload が全く別物になっているということです。

ということで、System::String constructor は String(char *) や String(wchar_t *) として新たに目次を起こすべきだと思います。

posted @ 0:02 | Feedback (2)