d的兩個編譯時

2021-09-27 18:21:51 字數 3049 閱讀 3570

兩個階段:astctfe,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

)

foreachast操作階段,未解釋,簡單視為節點,輸出:

@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為什...