我在Python解释器源代码中遇到过这个问题。
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 :(得分:5)
键存在于两个不同的命名空间中。曾经作为一个变量,曾经作为一个结构。编译器知道'struct key'和int key是不同的东西。
答案 1 :(得分:5)
p
是指向struct key
类型对象的指针。 q
是指向struct key
类型对象的指针的指针。
您可以定义如下结构:
struct key { int val; };
在这种情况下,类型为struct key
。
key
之后的struct
是类型(struct key
)的一部分,与整数参数key
无关。
答案 2 :(得分: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
类型,而不必过于考虑它。
答案 3 :(得分:0)
这些是指向struct的指针。 p是键结构的一个点,q是指向键结构指针的指针。在看到struct typedef或如何使用指针时,很难分辨出这里发生了什么。