假设我有一个带有指向相同类型变量的指针的结构,例如对于简单的链表实现。
这两种方法中哪一种最正确?
编辑:假设我之前已声明typedef struct list_ list;
,否则选项2将无法编译
选项1:
typedef struct _list
{
int num;
struct _list *next;
} list;
选项2:
typedef struct _list
{
int num;
list* next;
} list;
编译和工作,我应该使用哪个?
答案 0 :(得分:-1)
还有一个:
typedef struct _list list;
struct _list {
int num;
list* next;
};
修改强>
问题中提出的两个选项都是有效的,但我更喜欢第一个选项。选项号2有点可疑,因为在实际定义之前使用list
标识符。但是,编译器可能会接受这样的声明,因为它足以让他们知道next
成员是指向“某事物”的指针,并且他们不需要知道这一点是什么实际上'东西'是。在编译使用next
成员的表达式时,这将是必要的,但list
的含义(即,它是struct _list
的别名)将是知道。
出于这个原因,这两个选项是等价的,选择是品味或习惯的问题。
我上面提到的第三个选项有点不同。它正确地将list
声明为struct _list
的同义词,但不定义_list
结构。这允许您发布使用类型的函数原型而不发布类型本身:
假设您实现了一个库来管理某个容器。 cont.h文件可能看起来像这样:
typedef struct _container Container;
Container *CreateContainer(void);
void DestroyContainer(Container *cont);
int AddDataToContainer(Container *cont, const char *data);
int PrintContainer(const Container *cont);
虽然实现细节隐藏在一个单独的cont.c模块中:
#include "cont.h"
#include "stdlib.h"
struct _container {
// all members declarations
};
Container *CreateContainer(void)
{
// create an object
Container *cont = malloc(sizeof(Container));
if(cont != NULL) {
// initialize its members
;
}
// and return it (or NULL on malloc() failure
return cont;
}
void DestroyContainer(Container *cont)
{
// cleanup the container contents
;
// dispose the container itself
free(cont);
}
// ....
答案 1 :(得分:-1)
没有真正的'正确的'回答这个问题;这是个人喜好的问题。与所有风格问题一样,我会说以下内容:
答案 2 :(得分:-1)
您可以使用其中任何一个。它们基本上是一回事。