2012-08-29 48 views
3

尋找GMPlib的源代碼(用於多精度計算的Gnu庫)我發現了這種代碼來構建它的mp * _t結構。而且我已經在我已經完成的各種其他作品中複製了它,但我並不完全理解它。不理解這個結構typedefs

typedef struct 
{ 
    int _mp_alloc;   /* Number of *limbs* allocated and pointed 
           to by the _mp_d field. */ 
    int _mp_size;   /* abs(_mp_size) is the number of limbs the 
           last field points to. If _mp_size is 
           negative this is a negative number. */ 
    mp_limb_t *_mp_d;  /* Pointer to the limbs. */ 
} __mpz_struct; 

我明白,這定義了一個結構的「形」與兩個整數和一個mp_limb_t和它的typedef到__mpz_struct

然後就是這條線:

typedef __mpz_struct mpz_t[1]; 

過了一段時間,這另一個:

typedef __mpz_struct *mpz_ptr; 

我明白那第二個是typedefining __mpz_struct *mpz_ptr(這是在函數原型使用)

但我不明白,第一個做了什麼,以及爲什麼它的作品,所以我可以宣佈mpz_t。任何人都可以解釋爲什麼它有效

謝謝!

+0

多麼美妙的想法,typedef'_struct'作爲類型名稱中的後綴,因此您不必將'struct'寫爲前綴。哎呀。 – unwind

回答

4

理解typedef的最簡單方法是規則定義它就像你使用它。換句話說,當您聲明typedef時,您正在創建一個新名稱,但是如果您刪除typedef關鍵字,則會獲得作爲別名類型的對象。

例如:

typedef __mpz_struct mpz_t[1]; 

這使得一個新類型的名字,叫做 「mpz_t」。但是,如果我們改寫:

__mpz_struct some_obj[1]; 

我們立即明白它使得數組__mpz_struct是。所以現在我們知道新型號mpz_t a會做什麼:它使一個__mpz_struct包含一個元素。

+0

好吧,我認爲現在,你的答案和@AProgrammer的答案我明白它在做什麼。謝謝!我沒有看到mpz_t會創建一個包含一個元素的數組。 – Noxbru

0

C中的數組實際上等同於指針,因爲數組是指向數組的第一個元素的指針。 這裏,mpz_t被簡單地定義爲指向一個數組1 __mpz_struct

希望它有幫助。

1

第一個typedefs mpz_t爲一個__mpz_struct的數組(除了聲明一個類型外,typedef的語法與用於聲明對象的語法相同)。

順便說一句,typedef的指針是不是一個十分好主意,因爲它使得難以進行適當const正確性

1
typedef __mpz_struct mpz_t[1]; 

mpz_t定義爲一個__mpz_struct的陣列。興趣是如果你做

mpz_t x; 

你定義x爲一個__mpz_struct的數組。如果你

void f(mpz_t p) { ... } 

你將f作爲一個函數採取一個指向__mpz_struct,這樣你就可以調用

f(x); 

,它會調用F,指針傳遞到第一(和獨特的)x和f的元素可以修改x。因此您可以通過參考來模擬傳遞。第二個利益是你失去了做這種事的可能性

mpz_t x, y; 

x = y; 

爲什麼它很有趣?因爲__mpz_struct包含一個指針。並且複製指針不是正確的事情,你想要的副本也是指向的。

BTW va_list有時以相同的方式定義,並解釋了其使用限制。