【D言語】任意のコンパイルエラーを出す

D言語erのみなさん、こんにちは。

今回は、D言語で任意のコンパイルエラーを出す方法について語ります。

static assert(false, 〜〜)を使う


static assertは、失敗した時にメッセージを出力する機能があります。 それを使うと、コンパイル時にエラーを出すことができます。

コード


#line 42 "hoge.d"
static assert(false, "piyo fuga");

コンパイル結果


hoge.d(42): Error: static assert  "piyo fuga"

この方法には、以下のような問題があります。

  • static assertという無駄な文字列が前に追加される。
  • メッセージが二重引用符で括られてしまう。
  • ファイル名と行数を調整するには#lineを使わないといけない。

pragma(msg, 〜〜)を使う


pragmaのmsgを使うと、コンパイル時にメッセージを出力することができます。 これを使って、dmdのエラーメッセージの書式を真似てメッセージを出力し、 その後にstatic assert(false)でエラーを出すことによって、 それっぽいエラーをコンパイル時にエラーを出すことができます。

コード


import std.metastrings;
#line 42 "hoge.d"
pragma(msg, __FILE__ ~ "(" ~ toStringNow!__LINE__ ~ "): Error: piyo fuga");
static assert(false);

コンパイル結果


hoge.d(42): Error: piyo fuga
hoge.d(43): Error: static assert (false) is false

この方法なら、static assertの方法の問題を全て解決することができますが、 すこし複雑なコードになってしまいます。

まとめ


任意のコンパイルエラーを出す方法について語って来ました。 簡単にやりたい時はstatic assert、ちゃんとやりたい時はpragmaを使うといいと思います。 皆さんも、自分でコンパイルエラーを出したい時は、参考にしてみてください。

担当:美馬(pragma(msg, 〜〜)ってどうして標準エラーに出力させるの?)