未识别结构类型?

问题描述 投票:0回答:1

我有一个指向具体数据类型结构的抽象数据类型。功能位于 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 中完成的。

c visual-studio-2010 structure header-files
1个回答
2
投票

C++ 将为

labelGeneratorCDT
定义类型
struct labelGeneratorCDT
; C 没有。 (注意
.h
文件如何使用
typedef
来表示
labelGeneratorADT
。在 C++ 中,这会导致问题,因为
labelGeneratorADT
已经存在,并且无法将
typedef
编辑为
(struct labelGeneratorADT *)
。)

© www.soinside.com 2019 - 2024. All rights reserved.