Тип конструкции не определен? - PullRequest
2 голосов
/ 30 марта 2011

У меня есть абстрактный тип данных, который указывает на конкретную структуру типа данных. Функциональность находится в C-файле, а определение в заголовочном файле. Компилятор выдает мне следующую ошибку: labelgen.c (20): ошибка 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, и я не могу понять, почему это не скомпилируется. Это было сделано в визуальной студии 2010.

1 Ответ

2 голосов
/ 30 марта 2011

C ++ будет определять тип labelGeneratorCDT для struct labelGeneratorCDT;С не делает.(Обратите внимание, что файл .h использует typedef для labelGeneratorADT. В C ++ это может вызвать проблемы, поскольку labelGeneratorADT уже существует и не может быть typedef преобразован в (struct labelGeneratorADT *).)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...