dlang
D言語
CTFE

D言語のCTFE(コンパイル時関数実行)についてのメモ

More than 1 year has passed since last update.


CTFE(コンパイル時関数実行)とは?

字の通り、コンパイル時に関数を実行してくれる機能です

ある関数がCTFEになっているかどうかは、その関数内で__ctfeというのを使えば判断できます

CTFEされる際はtrueで、そうでないときはfalseとなるようです

例:

auto func(){

return __ctfe ? "ctfe" : "not";
}


どんな時にCTFEになるの?

なんとなく「コンパイラがコンパイル時に計算できると判断した関数はCTFEされる」と考えてましたが違うようです

こういう時は仕様書を読むのが一番なのでしょうが、「なんとなく流すように読む」ならともかく「きちんと厳密に読む」というのは自分の英語力的にきつい(時間がかかる)ので、実際に手を動かしてコードを動かして試してみました


結果

こんなコードを動かしてみました

import std.stdio;

auto func(){
return __ctfe ? "ctfe" : "not";
}

auto a = func();

void main(){
enum b = func();
static c = func();
immutable d = func();
const e = func();
writeln(a);
writeln(b);
writeln(c);
writeln(d);
writeln(e);

a = func();
writeln(a);
}

その結果、

$>rdmd test.d

ctfe
ctfe
ctfe
not
not
not

こうなりました

(グローバル変数aの挙動が微妙に理解できないので、あとでじっくりとドキュメント等読んでみます)