带标题的不完整类型

时间:2014-10-02 19:29:15

标签: c linker header-files

我有一个头文件:

Location.h

#ifndef LOCATION_H
#define LOCATION_H

#define MAX_X_GRID (3)
#define MAX_Y_GRID (3)

typedef struct _location Location;

extern Location *Location_create();
extern void Location_destroy(Location *);

#endif /* LOCATION_H */

..一个文件:

Location.c

#include <stdlib.h>
#include "Location.h"

#define VALID_LOCATION_CODE (245)
#define _location_check(l) \
    if ( l == NULL || l->_Valid != VALID_LOCATION_CODE ) \
        abort();

struct _location
{
    int x;
    int y;
    int _Valid;
};

struct _location *Location_create(const int x, const int y)
{
    if (x > MAX_X_GRID || y > MAX_Y_GRID)
        return NULL;

    struct _location *l = malloc(sizeof(struct _location));
    if (l == NULL)
        return NULL;
    l->x = x;
    l->y = y;
    l->_Valid = VALID_LOCATION_CODE;
    return l;
}

void Location_destroy(struct _location *l)
{
    _location_check(l);
    free(l);
}

..我正在测试代码:

test.c的

#include <stdio.h>
#include "Location.h"

int main(int argc, char const *argv[])
{
    Location *l = Location_create(1, 2);
    printf("x: %d, y: %d\n", l->x, l->y); /* line 6 */
    Location_destroy(l);
    return 0;
}

使用此命令编译程序时:

  

gcc test.c -o test -Wall

我收到这些错误:

  

test.c:6:27:错误:尝试取消引用不完整类型的指针

     

//第6行

     

test.c:6:33:错误:尝试取消引用不完整类型的指针

     

//第6行

从错误中,似乎gcc不知道我包含的头文件。

我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:2)

Location.h没有透露struct _location的内容(类型不完整),因此在编译test.c时,gcc不知道l->x和{{ 1}}是。

答案 1 :(得分:0)

您需要将structfunction declarations(不是定义)移到标题中。例如。将以下内容移到头文件中:

#ifndef LOCATION_H
#define LOCATION_H

#define MAX_X_GRID (3)
#define MAX_Y_GRID (3)

typedef struct _location Location;

struct _location
{
    int x;
    int y;
    int _Valid;
};

struct _location *Location_create(const int x, const int y);
void Location_destroy(struct _location *l);

#endif /* LOCATION_H */