DとCとをつなぐときの注意点

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並みをなんとか実現してくれないかなあ。