C语言的数据类型,但是当中的声明看不懂,请指教!

qq_41842671 2019-09-17 09:49:47
...全文
71 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
铖邑 2019-09-18
  • 打赏
  • 举报
回复
引用 2 楼 qq_41842671 的回复:
[quote=引用 1 楼 SuperDay的回复:]这个底下漏了#define _LIST_H 这是为了防止重复包含造成的重复定义错误,加入a.c包含a.h b.h,而a.h又包含b.h,这样在a.c中,b.h被包含了两次,采用这个宏定义的时候,第二次包含进去,因为有了宏定义而使#if #endif语句块失效
这个我知道,我想问一下当中的变量定义怎样回事,是不是伪代码?[/quote] 你对于伪代码的含义恐怕有所误解,伪代码的意思是,用一种代码来表达一种算法或者过程,而这种代码一般是现实中不存在的,你提供的这些代码是C语言,明确地显示一种实现方式,它就不会是伪代码。 再有,要把声明和定义区分开,声明是宣布一种类型的存在,一般情况下,不体现细节。好比你这里面的“struct Node;”,它是一种声明,struct里面的成员并不在这里体现出来,当我们只是用到指针或者引用的时候,这种细节并不是必要的。这样的做法的好处就是隐藏细节,符合OOP的精神。 而定义就是明确类型的内容部分(对于struct或class就是成员),且定义只能在一处进行,所以重复包含就会出错。当你是引用了定义以后,类似new操作就能进行的,因为new操作需要知道需要给要给实例分配多大的内存空间,而如果是声明的话,就不可以new了。 至于typedef,你可以把它理解成为一个同义词定义,形如“typedef a b;”等于是b是a的同义词,但这个a必须是声明或者定义过的。在上面那段代码里面,先声明“struct Node;”,然后“typedef struct Node *PtrToNode;”,就是说,“PtrToNode”是“typedef struct Node *”的同义词。 初学者很容易被这种格式迷惑,比如,当你声明一个函数的时候,一般是这样的: int fun(int, const char *); 那么函数(指针)类型的同义词应该怎么定义呢?又怎么看这样的结构呢?看下面这个式子: typedef int (*funptr)(int, const char *); 像这样的形式,一种小技巧就是先把标识符找出来,这个式子里面就是funptr,然后再把括号里面的内容用fun来还原,这样就回到上面那个函数声明: int fun(int, const char *); 说明funptr和fun属于同类型的,这样的话,就可以进行赋值了,“funptr = fun;”,于是之后的场合,可以用funptr来替代fun执行函数功能,比如:int res = funptr(100, "china");
qq_41842671 2019-09-18
  • 打赏
  • 举报
回复
引用 1 楼 SuperDay的回复:
这个底下漏了#define _LIST_H 这是为了防止重复包含造成的重复定义错误,加入a.c包含a.h b.h,而a.h又包含b.h,这样在a.c中,b.h被包含了两次,采用这个宏定义的时候,第二次包含进去,因为有了宏定义而使#if #endif语句块失效
这个我知道,我想问一下当中的变量定义怎样回事,是不是伪代码?
铖邑 2019-09-18
  • 打赏
  • 举报
回复
这个底下漏了#define _LIST_H 这是为了防止重复包含造成的重复定义错误,加入a.c包含a.h b.h,而a.h又包含b.h,这样在a.c中,b.h被包含了两次,采用这个宏定义的时候,第二次包含进去,因为有了宏定义而使#if #endif语句块失效
铖邑 2019-09-18
  • 打赏
  • 举报
回复
不好意思,刚才码字比较多,最后一部分写的有问题。我重新更正一下。 要把声明和定义区分开,声明是宣布一种类型的存在,一般情况下,不体现细节。好比你这里面的“struct Node;”,它是一种声明,struct里面的成员并不在这里体现出来,当我们只是用到指针或者引用的时候,这种细节并不是必要的。这样的做法的好处就是隐藏细节,符合OOP的精神。 而定义就是明确类型的内容部分(对于struct或class就是成员),且定义只能在一处进行,所以重复包含就会出错。当你是引用了定义以后,类似new操作就能进行的,因为new操作需要知道需要给要给实例分配多大的内存空间,而如果是声明的话,就不可以new了。 至于typedef,你可以把它理解成为一个同义词定义,形如“typedef a b;”等于是b是a的同义词,但这个a必须是声明或者定义过的。在上面那段代码里面,先声明“struct Node;”,然后“typedef struct Node *PtrToNode;”,就是说,“PtrToNode”是“typedef struct Node *”的同义词。 初学者很容易被这种格式迷惑,比如,当你声明一个函数的时候,一般是这样的: int fun(int, const char *); 那么函数(指针)类型的同义词应该怎么定义呢?又怎么看这样的结构呢?看下面这个式子: typedef int (*funptr)(int, const char *); 像这样的形式,一种小技巧就是先把标识符找出来,这个式子里面就是funptr,然后再把括号里面的内容用fun来还原,这样就回到上面那个函数声明: int fun(int, const char *); 说明funptr和fun属于同类型的,这样的话,就可以进行赋值了,“funptr f1 = fun;”,于是之后的场合,可以用f1来替代fun执行函数功能,比如:int res = f1(100, "china"); 另外,“funptr f1;”与下列写法等价,当更简洁: int (*f1)(int, const char *);

1,178

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 数据库及相关技术
社区管理员
  • 数据库及相关技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧