10

因此,出乎意料的是,编译器决定当面吐槽:“字段客户的类型不完整”。

以下是相关的代码片段:

客户.c

#include <stdlib.h>
#include <string.h>

#include "customer.h"

struct CustomerStruct;
typedef struct CustomerStruct
{
    char id[8];
    char name[30];
    char surname[30];
    char address[100];
} Customer ;

/* Functions that deal with this struct here */

客户.h

customer.h 的头文件

#include <stdlib.h>
#include <string.h>

#ifndef CUSTOMER_H
#define CUSTOMER_H

    typedef struct CustomerStruct Customer;

    /* Function prototypes here */

#endif

这就是我的问题所在:

customer_list.c

#include <stdlib.h>
#include <string.h>

#include "customer.h"
#include "customer_list.h"

#include "..\utils\utils.h"


struct CustomerNodeStruct;
typedef struct CustomerNodeStruct
{
    Customer customer; /* Error Here*/
    struct CustomerNodeStruct *next;
}CustomerNode;



struct CustomerListStruct;
typedef struct CustomerListStruct
{
    CustomerNode *first;
    CustomerNode *last;
}CustomerList;

/* Functions that deal with the CustomerList struct here */

这个源文件有一个头文件 customer_list.h ,但我认为它不相关。

我的问题

在 customer_list.c 中,在注释行中/* Error Here */,编译器抱怨field customer has incomplete type.

我整天都在谷歌上搜索这个问题,现在我要拔出我的眼球并将它们与草莓混合。

这个错误的根源是什么?

提前致谢 :)

[PS如果我忘了提什么,请告诉我。正如你所言,这对我来说是压力很大的一天]

4

4 回答 4

15

将结构声明移动到标题:

customer.h
typedef struct CustomerStruct
{
...
}
于 2012-11-29T20:53:25.427 回答
8

在 C 中,编译器需要能够计算出直接引用的任何对象的大小。sizeof(CustomerNode)可以计算的唯一方法是编译器在构建时可以使用 Customer 的定义customer_list.c

解决方案是将结构的定义从 移动customer.ccustomer.h

于 2012-11-29T20:55:30.407 回答
3

你所拥有的是Customer你试图实例化的结构的前向声明。这实际上是不允许的,因为编译器不知道结构布局,除非它看到它的定义。所以你要做的就是把你的定义从源文件移到头文件中。

于 2012-11-29T20:54:17.840 回答
3

似乎是这样的

typedef struct foo bar;

没有标题中的定义将无法工作。但是像

typedef struct foo *baz;

只要您不需要baz->xxx在标题中使用,就可以使用。

于 2015-03-04T15:51:08.757 回答