如下是一个头文件中对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的定义完成(遇到对应的右大括号),这样的限制也就消失,在后面的代码中完全可以正常的使用……
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个字节的,大小确定,无歧义。
但使用指针是没有问题的,原因是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能否一样,能否为同一结构类型,还取决于上下文,你没说清楚。
其次,这两个struct A能否一样,能否为同一结构类型,还取决于上下文,你没说清楚。
解决方案:5分
可别狡辩了。你把声明当成语句还有理了?
还有,就你那个例子问题也是大大的。如下例所示,有没有DECL,程序的效果是不同滴。
还有,就你那个例子问题也是大大的。如下例所示,有没有DECL,程序的效果是不同滴。
struct s {char c;}; //DECL void f (void) { typedef struct s * ps; struct s {float f;}; }
虚心一点,不是谁都愿意指出你的错误。
解决方案:2分
先有一种能描述鸡和蛋以及未来全部概念的语言
先有一种能指向鸡和蛋以及未来全部概念的指针
先有一种能指向鸡和蛋以及未来全部概念的指针