Back to page

− Links

 Print 

SampleCodes​/D言語文法​/コンパイル時実行関連​/1 :: D言語友の会

wiki:SampleCodes/D言語文法/コンパイル時実行関連/1

Table of contents
  • 概要
  • ポイント
    • CTFEableな関数の条件
  • サンプルコード
  • コンパイル結果
  • 補足
  • 投票とコメント

概要 anchor.png[1] Edit [2]

D言語のCTFE(コンパイル時関数呼び出し)機能を使うと、コンパイル時に関数を実行して結果を表示することが出来ます。

Page Top

ポイント anchor.png[3] Edit [4]

Everything is expanded.Everything is shortened.
1
 
pragma(msg, func(args));

と書く事で、CTFE可能な(CTFEableな)関数をコンパイル時に実行して表示させることが出来ます。

Page Top

CTFEableな関数の条件 anchor.png[5] Edit [6]

  • 関数のソースコードがある(extern宣言だけがある関数はCTFEableでない)
  • 関数の引数を、 C形式の可変個引数にしていない → Issue 6908[7]
  • synchronized関数でない
  • 関数内部に以下が存在しない
    • 例外のthrow(追記:例外をthrowする関数はCTFEableになりました)
    • クラスの使用(追記:クラスを使用する関数はCTFEableになりました)
    • グローバルな変数への参照
    • ローカルstatic変数への参照
    • delete式 → Issue 6907[8]
    • typeid式 → Issue 7147[9]
    • CTFEableでない関数の呼び出し
    • プラットフォーム間で互換性のないキャスト(例えばint[]からfloat[]へのキャスト、エンディアンに依存するキャストなど)
    • asm文
    • TemplateMixin文
    • synchronized文
    • throw文(throw文はCTFEableになりました)
    • with文(with文はCTFEableになりました)
    • scope文(scope文はCTFEableになりました)
    • try-catch-finally文(try-catch-finally文はCTFEableになりました)
    • ラベル付きbreak,continue文(ラベル付きbreak,continue文はCTFEableになりました)
Page Top

サンプルコード anchor.png[10] Edit [11]

Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
-
!
 
 
-
|
!
 
 
 
 
 
 
//main.d
 
import std.conv;
 
string hoge() {
    return "hello";
}
 
pragma(msg, hoge());
pragma(msg, to!int("6"));
pragma(msg, to!float("3.141592"));
 
void main(){}
Page Top

コンパイル結果 anchor.png[12] Edit [13]

1
2
3
4
~~~dmd.exe main.d
hello
6
3.141592
Page Top

補足 anchor.png[14] Edit [15]

CTFEには少なくないバグがあります。詳しくはここ[16]を参照してください。

Page Top

投票とコメント anchor.png[17] Edit [18]

Choices Vote
大変参考になった5  
参考になった0  
あまり参考にならなかった0  
まったく参考にならなかった0  

No comment. コメント​/SampleCodes​/D言語文法​/コンパイル時実行関連​/1Edit[19]

Name:

Last-modified: 2012-03-31 (Sat) 00:28:15 (JST) (3585d) by ゲスト