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

便利かもね。