我正在閱讀有關語言vala的內容,並將其編譯爲Ansi C代碼。不過,我也看到它支持像Java或Rust這樣的泛型。現在我的問題是這是如何編譯爲C代碼?如果我有一個泛型類或函數,會生成什麼樣的C代碼來模擬泛型行爲?Vala泛型轉換爲C代碼
2
A
回答
5
Vala泛型基於gpointer
和GType
。
您只能使用基於指針的類型參數來專門化Generic類。
class MyClass<T> {
public T val;
}
public static int main (string[] args) {
// This wouldn't compile!
// var il = new Gee.ArrayList<int>();
var il = new Gee.ArrayList<int?>();
var dl = new Gee.ArrayList<double?>();
il.add (5);
dl.add (3.0);
var im = new MyClass<int?>();
im.val = 5;
var dm = new MyClass<double?>();
dm.val = 3.0;
var lm = new MyClass< Gee.List<int?> >();
lm.val = il;
return 0;
}
您可以檢查自己生成的代碼與-C
參數:
valac -C Main.vala --pkg gee-0.8
這將產生一個main.c
文件。如果仔細閱讀,您將看到MyClass只有一個結構(加上一些額外的輔助結構,它們是基於GObject的類所需的),它具有成員gpointer val
,它也有一個GType t_type
以及一個t_dup_func
和一個t_destroy_func
。
struct _MyClass {
// ...
gpointer val;
};
struct _MyClassPrivate {
GType t_type;
GBoxedCopyFunc t_dup_func;
GDestroyNotify t_destroy_func;
};
確保正確的類型通過GLib type checking被執行。這使得Vala泛型類型安全(部分在編譯時和部分在運行時)。
這與在編譯時展開的C++模板形成鮮明對比。所以它比C#泛型更接近於傳統的C++模板。
我寫了「部分在編譯時」,因爲Vala編譯器足夠聰明,可以在C代碼中省略類型檢查,因爲它知道賦值總是正確的。
而且瓦拉生成的C代碼,就是要容易的使用對於具有GLib的綁定(如C,Python和C++,GJS等)
相關問題
- 1. 將C#泛型轉換爲Java泛型
- 2. C#類型轉換爲泛型參數
- 3. 轉換Java泛型到C#泛型
- 4. 轉換C++代碼轉換爲C#:SendMessageTimeout()
- 5. 將後代非泛型類轉換爲基類泛型類
- 6. C#泛型約束的泛型方法拒絕從整型轉換爲泛型
- 7. C#泛型類型轉換Decimal轉換爲Float - 「不能轉換類型'T1'? 'T2'「
- 8. 類型轉換泛型類型C++
- 9. 如何將這段代碼轉換爲泛型?
- 10. 如何將Java代碼轉換爲不使用泛型?
- 11. 轉換vb.net代碼轉換爲C#.NET
- 12. 隱式轉換IEnumerable轉換爲泛型
- 13. 如何轉換爲泛型?
- 14. 將Class []轉換爲泛型?
- 15. 將Java代碼轉換爲C#代碼
- 16. 將PHP代碼轉換爲C#代碼
- 17. 將JavaScript代碼轉換爲C代碼
- 18. 轉換Matlab代碼爲C代碼
- 19. 將僞代碼轉換爲C#代碼
- 20. 轉換泛型
- 21. C++到C#代碼轉換類型
- 22. 將java遺留代碼轉換爲泛型 - 如何用類型替換Object?
- 23. 作業:將轉換後的僞代碼轉換爲C代碼
- 24. C#強制類型轉換爲泛型強類型
- 25. 將泛型類型轉換爲對象
- 26. 轉換C#代碼
- 27. C#代碼轉換
- 28. C代碼轉換爲C++ SHA1問題
- 29. iPhone:將C#代碼轉換爲Objective-C
- 30. 將行代碼從C++轉換爲C
說你寫一個通用的'名單'然後其他編程語言使用'list '和'list '。 Vala編譯器將編寫具有適當行爲的C結構list_int和list_double。換句話說,實例化一個特定的泛型的工作是由Vala完成的。 –
nwp
這不會和C++模板一樣嗎?但模板並不像我想的泛型一樣。 – Exagon
C++模板的行爲與C#泛型相似(如[在此解釋](http://stackoverflow.com/a/31929/69809))。這與vala泛型將爲您傳遞的每個通用參數創建實際結構是一樣的。 – Groo