有趣的C struct语法/类型

时间:2011-05-27 21:09:13

标签: c struct

我在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这个词被重用了,而且我不知道编译器会在不同的命名空间中考虑它们。

4 个答案:

答案 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或如何使用指针时,很难分辨出这里发生了什么。