为什么我的 C 代码中的类型不完整?

问题描述 投票:0回答:1

我有两个头文件,即

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

c pointers struct incomplete-type
1个回答
0
投票

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
坐标。)

© www.soinside.com 2019 - 2024. All rights reserved.