【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, 〜〜)ってどうして標準エラーに出力させるの?)