如何解决有趣的C结构语法/类型
| 我在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;
我很困惑。
编辑:
即使已经回答了这个问题,我也应该澄清我的问题。特别是这样的事实,单词“ 3”已被重用,并且我不知道编译器会在不同的命名空间中考虑它们。
解决方法
键存在于两个不同的命名空间中。一次作为变量,一次作为结构。编译器知道\'struct key \'和int key是不同的东西。
, “ 4”是指向“ 5”类型的对象的指针。 “ 6”是指向“ 5”类型的对象的指针的指针。
您可以这样定义一个结构:
struct key { int val; };
在这种情况下,类型为struct key
。
struct
之后的key
是类型(struct key
)的一部分,并且不与整数参数ѭ3associated关联。
, 这些是指向struct的指针。 p是指向键结构的指针,而q是指向键结构的指针的指针。很难看到这里发生了什么,而没有看到struct typedef或如何使用指针。
, 首先,int key
参数与声明中的struct key
无关。那只是不幸的命名冲突。
尽管结构位于不同的命名空间中,所以它可以工作。
线
struct key *p,**q;
正在声明两个变量。
第一个名称为p
,类型为struct key *
。
第二个名称为q
,类型为struct key **
。
星号表示指针类型,它绑定到变量名而不是声明中的整体类型。
顺便说一句,正如我在mipadi的答案中所评论的那样,我有一位教授据说应该问Kernighan(或者可能是Ritchie)为什么C表达式会在语法上反映它们的声明。他说它将能够重用相同的解析代码。显然,C编译器几乎无法适应其编写的系统。
有时会很好,因为您可以确定是否有声明
int **foo[];
然后表达
**foo[3]
类型为23ѭ,而不必考虑太多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。