兩個階段:ast
與ctfe
,ast為生成樹,ctfe為編譯時求值.其實很簡單啦.ast樹,必須通過語義給樹加上意義
,然後求值函式才能求值
,對不對?不然,光是樹,是沒用的.
其中,模板變函式,遇見了,先造乙個ast的模板
,然後例項化時,就填充這個ast
,然後加入整個生成樹裡面
.
ctfe
,在語義分析
與**生成階段
.編譯時求值
就是把一些編譯時已知可以求值
的東西,求出來,這樣執行時就不必再求了.
因而,ctfe
不能訪問ast階段功能
,同樣,ast
無法訪問ctfe
時功能.
首先變成ast(代表程式結構,及所有可知道的東西)
,此時的ast
不含變數,記憶體,輸入,輸出
.模板變函式,在ast操作階段完成.因此必須知道編譯時模板引數,另乙個是靜如
,用於選擇ast子樹
.
structs(
bool b)
其發生在語義賦值
完成後,想想,這些樹語義都沒有,你拿什麼去求值?
常量摺疊
,更複雜的函式
,d都可以執行.基本上對純函式
都非常好.ctfe
可簡化一大堆沒必要的動作.甚至位元組碼直譯器
來操作.
強制編譯時求值
int
complicatedcomputation
(int x,
int y)
void
main()
int
ctfefunc
(bool b)
enum myint =
ctfefunc
(true
);
解決方法
:
1:int ctfefunc(bool b)()
.
2:
template
value
(bool b)
3:
int
ctfefunc
(bool b)
//有問題的下個
intctfefunc
(int x)
//按道理,根本就沒生成這個else塊
//但列印了兩下,說明pragma(msg,...)是在ast構造階段,還未賦值語義.因而不考慮其周圍塊是什麼東西.執行,就在該階段執行.而列舉編譯時求值後,則可能沒有了(該else塊ast子樹被刪了).
}enum y =
ctfefunc(50
);
著名的__ctfe
,在ctfe求值階段為1,在執行時為0
.
int
buildarray()
//相當於我生成了乙個快速版本,但後面我刪掉了自己,ctfe是重量級的**
else
}
出錯原因:statif if 發生在ast構造時
,__ctfe發生在語義賦值後
void
func
(args...
)(args args)
pragma
(msg,
"not an int");
else
pragma
(msg,
"not an int");
//解決方法.
//始終要列印
}//pragma,無視周圍
}void
main()
每一
在型別列表
時,不解釋斷
與下
.
import std.stdio;
void
func
(args...
)(args args)
}void
main()
//再看,比較:
import std.stdio;
void
func
(args...
)(args args)
}void
main()
//這是編譯器的輸出,即經過靜斷這句話
test.d(
16): error:
static assert (
!true
) is false
test.d(
21): instantiated from here: func!
(int
, string,
double
)
在foreach
的ast操作階段
,未解釋斷
和下
,簡單視為節點,輸出:
@safe void
func
(int _param_0, string _param_1,
double _param_2)
//**生成階段}}
//變成
void func!
(int
, string,
double)(
int __arg0, string __arg1,
double __arg2)
你搞懂了嗎?
遇到的兩個編譯問題
最近遇到兩個編譯問題,著實費了一番功夫。我在乙個地方,定義了container of的巨集,卻屢次出現編譯錯誤 巨集定義如下 define container of ptr,type,member 報錯如下 error expected declaration specifiers or befor...
Unity3D的兩個坑
unity3d雖然做東西便利,也因此帶來兩個很大的坑。其一是因為編輯器很容易關聯不同的指令碼,如果開發者經驗不足,會讓指令碼之間依賴混亂,最後組織結構如同蜘蛛網,修改起來極其麻煩。再微博上經常遇到乙個問題,很多人吐槽,c 指令碼和unityscript指令碼之間不能混用,基本上就是這個問題引起,因為...
函式的輸入變數為兩個指標時要注意兩個指標是否相等
下面時交換兩個數的函式 void swap int a,int b 當傳入的a和b的位址不是同乙個位址的情況下,函式正常工作 int a 1 int b 2 swap a,b 得到a 2,b 1當傳入的a和b的位址是同乙個位址的情況下,函式不正常工作 int a 1 swap a,a 得到a 0為什...