8

我开始学习 C 并遇到了一个问题。

我创建了一个日期 ADT 并想对其进行测试:)

基本上,我想从标准输入中读取一个字符串,将其转换为日期并在标准输出上打印出来。

编译这些文件后,我收到以下错误:

datetest.c:15:45: error: incomplete definition of type 'struct date'
  printf("Year: %d Month: %d Day: %d", d->year, d->month, d->day);
                                       ~^
./date.h:4:16: note: forward declaration of 'struct date'
typedef struct date Date;

我究竟做错了什么?

日期.c:

#include "date.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

struct date {
  int day;
  int month;
  int year;
};

/*
 * date_create creates a Date structure from `datestr`
 * `datestr' is expected to be of the form "dd/mm/yyyy"
 * returns pointer to Date structure if successful,
 *         NULL if not (syntax error)
 */
Date *date_create(char *datestr) {
  Date *d = (Date *)malloc(sizeof(Date));
  const char delimiter[2] = "/";
  char *token;

  if (d != NULL) {  
    token = strtok(datestr, delimiter);
    d->day = atoi(token);
    token = strtok(NULL, delimiter);
    d->month = atoi(token);
    token = strtok(NULL, delimiter);
    d->year = atoi(token);
    //printf("Day: %d Month: %d Year: %d\n", d->day, d->month, d->year);    
    //printf("Day: %p Month: %p Year: %p\n", *d->day, *d->month, *d->year);
  }
  return d;
};

/*
 * date_duplicate creates a duplicate of `d'
 * returns pointer to new Date structure if successful,
 *         NULL if not (memory allocation failure)
 */
Date *date_duplicate(Date *d) {
  Date *dd = (Date *)malloc(sizeof(Date));
  if (dd != NULL) {
    dd->day = d->day;
    dd->month = d->month;
    dd->year = d->year;
  }
  return dd;
};

/*
 * date_compare compares two dates, returning <0, 0, >0 if
 * date1<date2, date1==date2, date1>date2, respectively
 */
int date_compare(Date *date1, Date *date2) {
  if (date1->year < date2->year)
    return -1;
  else if (date1->year > date2->year)
    return 1;
  else {
    if (date1->month < date2->month)
      return -1;
    else if (date1->month > date2->month)
      return 1;
    else {
      if (date1->day < date2->day)
    return -1;
      else if (date1->day > date2->day)
    return 1;
      else
    return 0;
    }
  }
};

/*
 * date_destroy returns any storage associated with `d' to the system
 */
void date_destroy(Date *d) {
  if (d != NULL)
    free(d);
};

日期测试.c:

#include "date.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main() {
  Date *d;
  char buf[1024], *s;

  while (fgets(buf, sizeof(buf), stdin) != NULL) {
    if (!(d = date_create(buf))) {
    fprintf(stderr, "Unable to create a date.\n");
    return -1;
    }
      printf("Year: %d Month: %d Day: %d", d->year, d->month, d->day);
  }
}

日期.h:

#ifndef _DATE_H_INCLUDED_
#define _DATE_H_INCLUDED_

typedef struct date Date;

/*
 * date_create creates a Date structure from `datestr`
 * `datestr' is expected to be of the form "dd/mm/yyyy"
 * returns pointer to Date structure if successful,
 *         NULL if not (syntax error)
 */
Date *date_create(char *datestr);

/*
 * date_duplicate creates a duplicate of `d'
 * returns pointer to new Date structure if successful,
 *         NULL if not (memory allocation failure)
 */
Date *date_duplicate(Date *d);

/*
 * date_compare compares two dates, returning <0, 0, >0 if
 * date1<date2, date1==date2, date1>date2, respectively
 */
int date_compare(Date *date1, Date *date2);

/*
 * date_destroy returns any storage associated with `d' to the system
 */
void date_destroy(Date *d);

#endif /* _DATE_H_INCLUDED_ */
4

3 回答 3

12

struct date在 date.c 中定义,datetest.c 不知道它是什么。而是在 date.h 中声明它。目前它是一种不透明类型 - 任何包含 date.h 的东西都可以指向它,但不能访问成员。

于 2013-10-27T18:24:51.483 回答
3
datetest.c:15:45: error: incomplete definition of type 'struct date'
  printf("Year: %d Month: %d Day: %d", d->year, d->month, d->day);
                                       ~^
./date.h:4:16: note: forward declaration of 'struct date'
typedef struct date Date;

当编译器解析date.h时,它检测到date.h没有struct date但它使用date. 所以它抛出了那个音符note: forward declaration of 'struct date'

datetest.c您已包含date.h但未包含其中的实际定义,并且date.c编译器无法检测到该类型。这就是它抛出错误的原因

error: incomplete definition of type 'struct date'

为了解决这个问题,

struct date {
  int day;
  int month;
  int year;
};

将此移至date.h文件。

于 2013-10-27T18:25:27.670 回答
0

您的程序struct date.c文件中声明了 ,这意味着您只能访问文件中声明的.h内容。

您可以声明的原因date是因为您将其设为 apointer并且编译器知道所有指针的大小。但是,它对 a 的成员一无所知date,因此,您无法调用诸如d->year, d->month, d->day等之类的成员。调用这些成员会给您带来错误。

一种替代方法是制作一些返回 , 等的接口year函数month

由于您可能在数据结构类中,并且为您提供了头文件并且已指示不要更改它。我只会调用头文件中的函数,并打印诸如"passed"它们何时按预期工作并显示程序没有分段错误之类的内容,然后将其保留在该位置而无需调用year,month等。

于 2013-10-27T18:26:07.680 回答