我有两个头文件,即
point.h
和polygon.h
//point.h
#ifndef POINT_H
#define POINT_H
typedef struct Point point;
point *alloc_point(void);
int free_point(point *);
void init_point(point *, float, float);
void print_point(point *);
#endif
和
//polygon.h
#ifndef POLYGON_H
#define POLYGON_H
typedef struct Polygon polygon;
polygon *alloc_polygon(void);
int free_polygon(polygon *);
void init_polygon(polygon *, unsigned, point *);
void print_polygon(polygon *);
#endif
对应的
point.c
和 polygon.c
文件
//point.c
#include <stdlib.h>
#include <stdio.h>
#include "point.h"
struct Point
{
float x;
float y;
};
point *alloc_point(void)
{
point *pt = (point *)malloc(sizeof(point));
if(pt)
{
return pt;
}
else
{
fprintf(stderr, "Could not allocate point. Aborting\n");
exit(EXIT_FAILURE);
}
}
int free_point(point *pt)
{
if(pt)
{
free(pt);
pt = NULL;
return 1;
}
else
{
fprintf(stderr, "Could not free point. Aborting\n");
return 0;
}
}
void init_point(point *pt, float x, float y)
{
pt -> x = x;
pt -> y = y;
}
void print_point(point *pt)
{
printf("Point at (%f, %f)\n", pt -> x, pt -> y);
}
和
//polygon.c
#include <stdio.h>
#include <stdlib.h>
#include "point.h"
#include "polygon.h"
struct Polygon
{
unsigned nside;
point *centre;
};
polygon *alloc_polygon(void)
{
polygon *poly = (polygon *)malloc(sizeof(polygon));
if(poly)
{
return poly;
}
else
{
fprintf(stderr, "Cannot allocate polygon. Aborting\n");
exit(EXIT_FAILURE);
}
}
int free_polygon(polygon *poly)
{
if(poly)
{
free(poly);
poly = NULL;
return 1;
}
else
{
fprintf(stderr, "Cannot free polygon. Aborting\n");
exit(EXIT_FAILURE);
}
}
void init_polygon(polygon *poly, unsigned nside, point *centre)
{
poly -> nside = nside;
poly -> centre = centre;
}
void print_polygon(polygon *poly)
{
printf("%u-sided polygon with centre at (%f, %f)", poly -> nside, poly -> centre -> x, poly -> centre -> y);
}
当我尝试运行
main.c
时,其中包含
#include <stdio.h>
#include "point.h"
#include "polygon.h"
int main() {
point *centre = alloc_point();
init_point(centre, 10.0, 10.0);
print_point(centre);
unsigned nside = 4;
polygon *poly = alloc_polygon();
init_polygon(poly, nside, centre);
print_polygon(poly);
free_point(centre);
free_polygon(poly);
return 0;
}
我收到错误消息(来自
print_polygon
内的 polygon.c
方法)
错误:取消引用指向不完整类型“point”{aka“struct Point”}的指针
我没有收到该错误,因为
Polygon
结构的定义有一个指向 point
的指针。为什么我无法运行代码?
P.S.:我使用 gcc 8.1.0 并使用编译
gcc -Os -Wall -Wextra -Wpedantic -Werror -std=c99 .\main.c .\point.c .\polygon.c -o .\main.exe
在
poly -> centre -> x
中,poly -> centre
是指向 point
的指针,-> x
取消引用 point
,但 polygon.c
没有 point
的定义。
解决此问题的一些选项是:
point
的定义在 polygon
中可见。point.c
中定义一个例程,该例程将打印点的坐标,从 point.c
(通过 point.h
)导出该例程,并从 print_polygon
调用它。point.c
中定义一个或多个例程以提供坐标,导出该例程或从 print_polygon
调用它以获取要打印的值。(最后,可以通过从结构中的一个例程返回坐标来提供坐标,该结构的定义在
point.c
和 polygon.c
之间共享,通过在单独的例程中返回两个 float
坐标(每个例程一个),或者通过返回通过引用传递的 float
对象中的两个 float
坐标。)