auto属性とprintf
auto属性のテスト。
import std.c.stdio; class Hoge{ char[] name; this(char[] n){ name = n; printf("%s constructor called\n", name); } ~this(){ printf("%s destructor called\n", name); } } void main(){ hoge(); printf("main end\n"); } void hoge(){ Hoge a = new Hoge("A"); auto Hoge b = new Hoge("B"); printf("hoge end\n"); }
さて結果は。
C:\d>dmd auto.d C:\dmd\bin\..\..\dm\bin\link.exe class,,,user32+kernel32/noi; C:\d>auto Error: Access Violation
多分変数に対するダメなアクセスがあるらしい。うーん。
printf無くしたら動いたのでその辺らしかった。のでprintfで検索した。
結果 → http://www.kmonos.net/alang/d/interfaceToC.html
printf のフォーマット指定がDのデータ型と合うかどうか、 が問題になります。printf はNUL終端の文字列を扱うようになっていますが、 Dでのcharの動的配列はそうなっていません。 しかし配列データの前に 4バイトで配列のサイズが置かれていますので、%.*s を使うと完璧に動作します:
%.*s…相当暗号じみてるなあ。文字列リテラルそのまんま出力とかでないならprintf捨てろということか。
修正して実行。
A constructor called B constructor called hoge end B destructor called main end A destructor called
便利かもね。