数据类型互相定义,先有鸡还是先有蛋?

C语言 码拜 4年前 (2015-11-28) 201次浏览
如下是一个头文件中对Task和TaskData的定义。本人有点不太理解这种定义方法,定义Task的时候,用到了TaskData类型,而定义TaskData的时候,其成员函数指针有用到了TaskData类型。
这两种类型定义都包含彼此,相互定义,这种定义是怎么工作的?先有鸡还是先有蛋,本人有点晕了

/* This file was automatically generated from syscalls.in 17.2 */
#ifndef __MESSAGE__H
#define __MESSAGE__H
#include <csrtypes.h>
/*! @file message_.h @brief Message types */
/*!
Message identifier type.
*/
typedef uint16 MessageId;
/*!
Message delay type.
*/
typedef uint32 Delay;
/*!
Message type.
*/
typedef const void *Message;
/*!
Task type.
*/
typedef struct TaskData *Task;
/*!
TaskData type.
*/
typedef struct TaskData { void (*handler)(Task, MessageId, Message); } TaskData;
#endif
解决方案:3分
这个有点链表的意味。例如:
typedef struct ugl_node
{
struct ugl_node *pNext;
struct ugl_node *pPrev;
struct ugl_list *pList;
} UGL_NODE;
哪怕还没有声明struct ugl_node,也照样可以使用struct ugl_node *pNext。原因是编译器完全可以识别出这是指向结构体的指针,但是只有定义了结构体ugl_node之后,才可以进行解引用操作如*pNext,即pNext的用处是极度受限的。不过只要struct ugl_node的定义完成(遇到对应的右大括号),这样的限制也就消失,在后面的代码中完全可以正常的使用……
解决方案:3分
假如嵌套类型的使用,递归定义,导致size无法确定了,就会有逻辑问题。
但使用指针是没有问题的,原因是32位下指针总是4个字节的,大小确定,无歧义。
解决方案:2分
这种定义是合法的,你也可以写成:

typedef struct TaskData { void (*handler)(struct TaskData*, MessageId, Message); } TaskData;
解决方案:3分
下面语句 A定义在typedef之后,仍然是可以的

typedef struct A* Task;
struct A
{
};
解决方案:2分
首先,没见过这样的“语句”;
其次,这两个struct A能否一样,能否为同一结构类型,还取决于上下文,你没说清楚。
解决方案:5分
可别狡辩了。你把声明当成语句还有理了?
还有,就你那个例子问题也是大大的。如下例所示,有没有DECL,程序的效果是不同滴。

struct s {char c;};            //DECL
void f (void)
{
    typedef struct s * ps;
    struct s {float f;};
}

虚心一点,不是谁都愿意指出你的错误。

解决方案:2分
先有一种能描述鸡和蛋以及未来全部概念的语言
先有一种能指向鸡和蛋以及未来全部概念的指针

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明数据类型互相定义,先有鸡还是先有蛋?
喜欢 (0)
[1034331897@qq.com]
分享 (0)