才明白什么是C的结构体

作者: yangzhe1991 分类: 我是搞技术的 发布时间: 2010-11-28 17:24 ė 6没有评论

刚才写一个纯C的东西,然后发现有一段代码不能编译

void insert(Node *node,int p,double x,double y,int k)

准确的说,返回的报错很诡异,说*之前应该有个)。看了半天没明白啥意思。后来突然想起来当初两个结构体的成员互相使用对方类型的时候,定义前面加了个struct就可以了。

于是改成void insert(struct Node *node,int p,double x,double y,int k),gcc通过……

然后后来问了下@JavranC,再google下,发现是因为定义结构体时的问题。

一般我定义结构体直接就是struct定义:

struct Node

{

};

事实上这里的Node并不是数据类型。算数据类型的是struct Node。如果在}和;之间加上一个变量比如node,其实相当于额外加一行struct Node node.如果在C语言环境下,在定义外面其实Node node是不可以的,会告知并没有Node这个数据或者函数。

如果想让Node 是一个数据类型,随时随地Node xxx定义变量需要用typedef:

typedef struct S

{


}SS;

这样SS就代表了中间那堆成员的结构体数据类型。可以随时SS xxx定义变量了。当然那个S 可以省略,因为用不到,如果不省略的话继续struct S xxx也一样可以用。当然用typedef之后就不能直接在定义结构体的时候就把变量也定义出来了。

typedef其实就是一个类型的定义,主要用来简化。

typedef aaa bbb;就是从今以后用bbb来代之aaa。当然aaa需要是一个数据类型,不像#define可以替代任何东西。其实typedef本身是一个语句,需要分号结尾,#define其实就是字符串匹配然后直接替代的一个宏。

至于typedef struct S{}SS;其实就是先struct S{};  后typedef struct S SS,用SS指代struct S。

虽然这很基础,但是之前确实不知道……

之前一直都先定义再直接Node node,毫无压力。因为要么用的是cpp的后缀名,要么就算是c也调用的c++的编译器。在C++和C的结构体是不一样的。C++的结构体扩充了很多功能,其实跟class本质上已经没任何区别了,只是默认的public还是private的问题。C++的结构体一样可以搞出成员函数来,但C肯定是不行,不然C也面向对象了……

要学的还真有很多……纯C语言其实真没怎么接触过。


本文出自 杨肉的演讲台,转载时请注明出处及相应链接。

本文永久链接: https://yangzhe1991.org/blog/2010/11/%e6%89%8d%e6%98%8e%e7%99%bd%e4%bb%80%e4%b9%88%e6%98%afc%e7%9a%84%e7%bb%93%e6%9e%84%e4%bd%93/

0

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Ɣ回顶部