空结构typedef

时间:2014-04-14 18:53:57

标签: c struct void-pointers

开始这是一个家庭作业问题:

该项目的目标是为void *数据类型实现双链表。

我获得了一个带有以下结构定义的.h文件:

//dlList.h
#ifndef _DLLIST_ADT_H_
#define _DLLIST_ADT_H_

#include <stdbool.h>

#ifndef _DLL_IMPL_

/// DlList_T points to a representation of a double-linked list 
/// of void pointers (to abstract data objects).
typedef struct { } * DlList_T;

#endif

//Function declarations below

#endif

在我的dlList.c文件中,我试图做这样的事情:

//dlList.c

typedef struct _dlNode{

    struct _dlNode *prev;
    struct _dlNode *next;
    void * data; //pointer to a memory address

} dlNode;

struct _DlList_T{

    struct _dlNode *start; //the first item in the list
    struct _dlNode *cursor; //the current item the list is pointing to
    int curIndex; //index of current item
    int maxIndex; //number of items in list


} * DlList_T;

//Rest of .c file 

我的所有错误都与

的变体有关
  

&lt; DlList_T&#39;

的冲突类型

我在.c文件中尝试了几种结构变体,但我想我错过了一些非常明显的结构...

我是否应该在我的.c文件中使用我的DlList_T结构,将其重命名为其他内容,然后在需要时将其强制转换......?

另外请注意,我不允许以任何方式更改.h文件。当我提交项目时,try将使用.h文件的本地副本。

我很失落,任何帮助都会受到赞赏,谢谢!

编辑:#ifndef和#endif&#39; s包含头文件

编辑2:使用-std = c99标志使用gcc编译。

5 个答案:

答案 0 :(得分:1)

您的第一个错误是{。1}}是.h文件中的类型,而.c文件中是变量。这无效。

其次,你不应该

DlList_T
<。>在.h文件中,但

typedef struct { } * DlList_T;

或类似的东西。这称为前向声明(针对两个不同的名称,typedef struct DlList * DlList_T; struct DList

然后在.c文件中使用Dlist_T的{​​{1}}声明。这就是隐藏C类型工作细节的方法。如果你的教师确实在头文件中给你一个版本{},那么他或她应该在教导他人之前先修改基本的C. (空struct Dlist是C中的约束违规,但可能被gcc接受为扩展名。)

答案 1 :(得分:0)

您从这句话开始

typedef struct { } * DlList_T;

typedef的{​​{1}}和空结构到DlList_T的标识符。

然后,稍后会出现

struct _DlList_T{

    struct _dlNode *start; //the first item in the list
    struct _dlNode *cursor; //the current item the list is pointing to
    int curIndex; //index of current item
    int maxIndex; //number of items in list
} * DlList_T;

同样typedef使用相同的标识符DlList_T。这是非法的。

答案 2 :(得分:0)

我建议在头文件中包含列表节点的结构定义,但是你不能修改它,你必须将它放在.c源文件中。

您的错误表明您对类型DlList_T有多个定义:您不能说DlList_T是空结构的类型别名(您在标题中执行此操作)和在同一类型上指向struct _DlList_T的指针(在源文件中执行)。

所以,第一步:首先为列表变量选择另一个名称,例如dbl_list

struct _DlList_T {

    struct _dlNode *start; //the first item in the list
    struct _dlNode *cursor; //the current item the list is pointing to
    int curIndex; //index of current item
    int maxIndex; //number of items in list


} *dbl_list;

定义具有前导_的结构也是一个坏主意,因为这些是为实现保留的 - 考虑选择其他名称。

头文件应改为:

typedef struct DlList *DlList_T;

或类似的东西(可能有不同的结构标签)。你展示的代码不是标准的C(空结构不是标准的),没有任何意义。如果这是您的指示,我认为您应该将其报告为错误。或者,确保完成课程练习 - 也许您应该使用具有启用此类构造的扩展的特定编译器。但要预先警告它不便携。

答案 3 :(得分:0)

根据您的最新更新,请考虑按以下方式进行操作:

...

#define _DLL_IMPL_
// This is to prevent dlList.h from making that illegal thing

typedef struct _dlNode {

    struct _dlNode *prev;
    struct _dlNode *next;
    void * data; //pointer to a memory address

} dlNode;

typedef struct _DlList_T {

    struct _dlNode *start; //the first item in the list
    struct _dlNode *cursor; //the current item the list is pointing to
    int curIndex; //index of current item
    int maxIndex; //number of items in list

} * DlList_T;

#include "dlList.h"

...

或者那些东西。在DlList_T.h文件中使用之前,请确保.c已被类型定义为有效结构。由于您不能违反.h文件,因此您应该在包含它之前立即执行此操作。

通过使用适当的预处理程序指令(在这种情况下为#define _DLL_IMPL_

),您似乎最有可能被要求阻止这样的非法类型定义。

答案 4 :(得分:0)

#include <dlList.h>

typedef struct _dlNode
   {
   struct _dlNode *prev;
   struct _dlNode *next;
   void * data; //pointer to a memory address
   } dlNode;

struct _MyList_T
   {
   struct _dlNode *start; //the first item in the list
   struct _dlNode *cursor; //the current item the list is pointing to
   int curIndex; //index of current item
   int maxIndex; //number of items in list
   } * MyList_T;

void dll_clear(DlList_T lst)
   {
   MyList_T list = (MyList_T)lst;

   list->cursor...

   return;
   }