我有一个头文件:
#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 */
..一个文件:
#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);
}
..我正在测试代码:
#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不知道我包含的头文件。
我该怎么做才能解决这个问题?
答案 0 :(得分:2)
Location.h
没有透露struct _location
的内容(类型不完整),因此在编译test.c
时,gcc不知道l->x
和{{ 1}}是。
答案 1 :(得分:0)
您需要将struct
和function 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 */