我有一个指向具体数据类型结构的抽象数据类型。功能在C文件中,而定义在头文件中。编译器给出了以下错误:labelgen.c(20):error C2065:'labelGeneratorCDT':未声明的标识符
这是标题:
#ifndef _labelgen_h
#define _labelgen_h
// labelGeneratorCDT is defined as a structure
// for a label generator, with labelGeneratorADT
// being a pointer to it
typedef struct labelGeneratorCDT* labelGeneratorADT;
// Function to generate a new labelGeneratorADT
labelGeneratorADT NewLabelGenerator(char* prefix, int sequenceNum);
// Function to retrieve the new label string
char* GetNextLabel(labelGeneratorADT labelGenerator);
// Function to free the memory allocated to the labelGeneratorADT
void FreeLabelGenerator(labelGeneratorADT labGenerator);
#endif
这是C文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "labelgen.h"
// labelGenerator CDT has a prefix string
// and a sequence number to start with
struct labelGeneratorCDT
{
char* prefix;
int sequenceNum;
};
labelGeneratorADT NewLabelGenerator(char* prefix, int sequenceNum)
{
// Start with NULL, shorter line
labelGeneratorADT labelGenerator = NULL;
// Allocate enough memory to fit a labelGeneratorCDT
labelGenerator = (labelGeneratorCDT*)(malloc(sizeof(labelGeneratorCDT)));
// Allocate memory for the prefix string
labelGenerator->prefix = (char*)(malloc((strlen(prefix)+1)*(sizeof(char))));
// Copy over prefix
strcpy(labelGenerator->prefix,prefix);
// Simply copy the sequence number
labelGenerator->sequenceNum = sequenceNum;
return labelGenerator;
}
char* GetNextLabel(labelGeneratorADT labelGenerator)
{
return "0";
}
void FreeLabelGenerator(labelGeneratorADT labGenerator)
{
return;
}
代码显然非常简单,但我是C结构的初学者,而对于我的生活,我无法弄清楚为什么这不会编译。这是在visual studio 2010中完成的。
答案 0 :(得分:2)
C ++将为labelGeneratorCDT
定义类型struct labelGeneratorCDT
; C没有。 (请注意.h
文件如何使用typedef
labelGeneratorADT
。在C ++中会导致问题,因为labelGeneratorADT
已经存在且无法typedef
(struct labelGeneratorADT *)
。)