2011-05-27 42 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或指针被如何使用的情况下,很难说出这里发生了什么。