2011-05-27 43 views
2

我在Python解釋器源代碼中遇到了這個問題。有趣的C結構語法/類型

void 
PyThread_delete_key_value(int key) 
{ 
    long id = PyThread_get_thread_ident(); 
    struct key *p, **q; 

有趣的部分是struct key *p, **q;調用。這個結構究竟做了什麼?我很困惑這是什麼結構。這是不是一樣的說,這?

struct 1 *p; 

我很困惑。

編輯

儘管這已經回答了,我要澄清我的問題。具體的事實是,key這個詞被重用,我不知道編譯器認爲它們在不同的命名空間中。

+0

'struct 1 * p;'這甚至可能嗎?!? – karlphillip 2011-05-27 21:22:35

+0

@karlphillip:不,它不是。因此我的困惑。 – Falmarri 2011-05-31 08:46:46

回答

5

鍵存在於兩個不同的命名空間中。曾經作爲一個變量,曾經作爲一個結構。編譯器知道'struct key'和int key是不同的東西。

+0

謝謝,這是我所理解的問題。 – Falmarri 2011-05-27 21:21:05

5

p是指向struct key類型的對象的指針。 q是指向struct key類型的對象的指針。

可以定義一個結構,如下所示:

struct key { int val; }; 

在這種情況下,類型爲struct key

struct之後的key是類型(struct key)的一部分,與整型參數key沒有關聯。

+0

我認爲這是誤導。如果有人在代碼中寫入了* p,它將不會是「指向對象的指針」類型。它將是「對象」類型。 C語言有目的地聲明和表達式的這種對稱性。 (雖然承認最初的目的可能是「重複使用相同的解析代碼」) – jwd 2011-05-27 21:16:27

0

首先,int key參數與聲明中的struct key無關。這只是一個不幸的命名衝突。

雖然結構在不同的命名空間,所以它的工作原理。

struct key *p, **q; 

正在申報兩個變量。

第一個被命名爲p並且類型爲struct key *。 第二個被命名爲q,類型爲struct key **

星號表示指針類型,它將變量名綁定到聲明中的整體類型上,而不是

另外,正如我在mipadi's answer中所評論的那樣,我有一位教授被問到Kernighan(或者它是Ritchie),爲什麼C語言在語法上反映了他們的聲明。他說能夠重新使用相同的解析代碼。很明顯,C編譯器在寫入的系統上非常適合。

這是好的,有時,因爲你可以肯定的是,如果你有申報

int **foo[]; 

則表達式

**foo[3] 

將是int類型,而不必執着於它。

0

這些是指向結構的指針。 p是指向鍵結構的指針,q是指向鍵結構指針的指針。在看到struct typedef或指針被如何使用的情況下,很難說出這裏發生了什麼。