Cの関数は呼び出し規約の指定付きで宣言します。 大抵は "C" 呼び出し規約で問題ないでしょう。例えば: extern (C) int strcmp(char *string1, char *string2); すると、Dのコードからは当たり前のように呼び出すことができます: import string; int myDfunction(char[] s) { return strcmp(string.toCharz(s), "foo\0"); }
Dの文字列は0終端になっていません。詳しくは "データ型の互換性" をご覧下さい。
文字列の取り扱いが違うことに注意。上のDから呼び出す側のコードを、
return strcmp(s, "foo\0");
とすると、「だいたいうまくいくが、メモリ空間の機嫌によってはこける」という非常にサバいバグを生む。MIX_LoadWAVが、あるファイル名に関してまれにnullを返す、とかいう謎挙動を始めた理由がこれだった。なんかバグの温床になりそうな予感。なんで0終端にしなかったのかな。
鋭い読者の方は、例の printf のフォーマット文字列リテラルが \0 で終わっていないことに気付かれたでしょう。これは、 より大きな構造体の初期化子の一部でない限り、 文字列リテラルの後ろには \0 が格納されるようになっているためです。
これもいまいち何を言ってるのか分からない。結局0終端してるのか、してないのか、はっきりせいっちゅうねん。
あとtoCharzはdeprecatedなので、toStringzを使おう。
今調べたらSDL_WM_SetCaptionも間違ってたよ。危ないなあ。C関数にchar[]渡してたらウォーニング出して欲しい。Dのコンパイラ、全般にウォーニングが甘いんだよね。gccの-Wall並みをなんとか実現してくれないかなあ。