C的動態型別檢查
C的動態型別檢查
這次美國之行的一大收穫就是終於正視了Objective-C而不再只是當它是不順手的工具了。這主要是有機會拜讀了Brad Cox的《Objective-Oriented Programming, an evolutionary approach》。今天就談談它第91頁提到的那個極少C程式設計師甚至C編譯器作者知道的一個極為餛飩的語法:
struct MYSTRUCT someVariables;
someVariable = (*((struct MYSTRUCT *)(*)() _msg))(someObject, …);
C語言是靜態型別檢查的編譯語言.例如下面程式定義和使用了兩個型別:浮點和定點。
#include <stdio.h>
typedef struct {
float x, y;
} FloatingPoint;
typedef struct {
int x, y;
int scale;
} FixedPoint;
int main() {
FloatingPoint flo;
FixedPoint fix;
printf("(%f,%f)\n", flo.x, flo.y);
printf("(%f, %f)\n", 1.0*fix.x/fix.scale, 1.0*fix.y/fix.scale);
}
不同型別間的轉換需要cast,否則編譯時會被警告。後門還是有的,就是void *型別。我們宣告id是此void *型別,加入一個使用它的迷你函式:
typedef void *id;
id thePoint(id thePoint) {
return thePoint;
}
這樣在main裡我們可以使用明確的型別轉換,不會被警告:
id flid = thePoint(&flo);
printf("(%f,%f)\n", ((FloatingPoint *)flid)->x, ((FloatingPoint *)flid)->y);
但型別錯了也沒了警示報告:
FloatingPoint *flip = thePoint(&fix);
printf("(%f,%f)\n", flip->x, flip->y);
我們試著改寫為間接的函式指標型別,當然也沒有編譯預警:
id (*thePointPointer)(id);
thePointPointer = &thePoint;
flip = thePointPointer(&fix);
printf("(%f,%f)\n", flip->x, flip->y);
但如果我們加入明確型別,就會看到預期的警示,雖然是有些囉嗦:
FloatingPoint *(*theFloatingPointPointer)(FloatingPoint *);
theFloatingPointPointer = &thePoint;
flip = theFloatingPointPointer(&fix);
printf("(%f,%f)\n", flip->x, flip->y);
但這很容易解決,寫在一行就行了:
FloatingPoint *flop = ((FloatingPoint *(*)(FloatingPoint *))&thePoint)(&fix);
我想這就是書中提到的意思。Objective-C是超級的C語言,這些餛飩都被精心的包裝成了簡潔的語法。帶型別檢查的動態語言 —— 我喜歡。
相關文章
- React的靜態型別檢查React型別
- Vue中的靜態型別檢查Vue型別
- C# 中的動態型別C#型別
- Flow:Facebook 的 JavaScript 靜態型別檢查器JavaScript型別
- 型別檢查型別
- Flow_JS靜態型別檢查器JS型別
- flow–facebook出品的javascript靜態型別檢查器JavaScript型別
- C++ 動態型別轉換C++型別
- JavaScript 中的型別檢查JavaScript型別
- C# 4.0中的動態型別和動態程式設計C#型別程式設計
- Python 型別檢查Python型別
- Python中的型別檢查Python型別
- 淺談程式語言型別的強型別,弱型別,動態型別,靜態型別型別
- Flow靜態型別檢查及在Vue專案中的使用型別Vue
- React手稿之型別檢查React型別
- 檢查型別是否溢位型別
- 程式碼靜態掃描規則——型別轉換檢查型別
- Groovy 2.0靜態型別檢查及編譯功能介紹型別編譯
- 建立自定義塊 - 型別檢查型別
- 編譯期型別檢查 in ClojureScript編譯型別
- GitHub 熱門:微軟新開源的 Python 靜態型別檢查器Github微軟Python型別
- C++檢視資料型別C++資料型別
- React 快速上手 – 10 型別檢查 PropTypesReact型別
- React 快速上手 - 10 型別檢查 PropTypesReact型別
- JavaScript 需要檢查變數型別嗎JavaScript變數型別
- C++ 變數型別查詢C++變數型別
- C語言中資料型別的自動型別轉換C語言資料型別
- oracle ckpt檢查點型別(增量及常規完全檢查點)checkpointOracle型別
- 你用過 PropTypes 的這些型別檢查麼?型別
- C++ 查詢某個變數的型別C++變數型別
- elasticsearch的object型別和動態對映ElasticsearchObject型別
- 動態語言與鴨子型別型別
- 重拾Kotlin(10)-型別的檢查與轉換Kotlin型別
- C#的型別——值型別與引用型別C#型別
- vue2.0專案配置flow型別檢查Vue型別
- SAP 物料移動型別查詢表型別
- Python進階09 動態型別Python型別
- C# 檢測真實的檔案型別函式C#型別函式