不允许指向不完整类类型“struct punto”的指针

piwo6bdm  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(145)

我试图创建一个创建点列表的代码。我有一个名为“punti.c”的文件和一个名为“item.c”的文件。问题是我不能从项目访问结构点(x,y)的变量。

//item.c
#include <stdio.h>
#include "item.h"
#include "punti.h"

int eq(item it1, item it2)
{
    return it1->x == it2->x; //the problem is here
}
//item.h
#include "punti.h"
typedef Punto item;

int eq(item x, item y);
//punti.c
#include "utilities.h"
#include "punti.h"
#include <math.h>

struct punto
{
    double x;
    double y;
};
//punti.h
typedef struct punto *Punto;

我用很多方法测试了Punto类型,所以我确信它可以工作。我试图改变item的typedef,使其成为指向Punto的指针,但它不起作用。(部分代码是意大利语,抱歉:))

8oomwypt

8oomwypt1#

标头punti.h声明名称Punto作为指针类型struct punto *到不完整类型struct punto的别名。

//punti.h
typedef struct punto *Punto;

此头文件包含在头文件item.h中,其中声明了typedef名称item,作为在函数eq的参数声明列表中使用的typedef名称Punto的别名:

//item.h
#include "punti.h"
typedef Punto item;

int eq(item x, item y);

typedef名称Punto和item仍然表示指向不完整结构类型的指针类型。它们可以在函数声明中使用,因为指针本身总是完整类型。
但是在模块item.c中,在函数eq的定义中,使用表达式来访问不完整结构类型struct punto的数据成员

//item.c
#include <stdio.h>
#include "item.h"
#include "punti.h"

int eq(item it1, item it2)
{
    return it1->x == it2->x; //the problem is here
}

此时,编译器不知道结构struct punto是否确实包含数据成员x。因此它会发出错误。您需要在试图访问结构的数据成员的模块中包含完整的结构声明。否则编译器将报告错误。

w46czmvw

w46czmvw2#

struct punto的定义需要为item.c所知(例如,包含在punti.h中)。

// punti.h
struct punto
{
    double x;
    double y;
};

typedef struct punto *Punto;

你可以把typedef看作一个别名。“typedef声明提供了一种方法来声明一个标识符作为类型别名,用于替换可能复杂的类型名”(cppreference)。编译器几乎只是用它定义的内容替换typedef。你的函数相当于:

int eq(struct punto* it1, struct punto* it2)
{
    return it1->x == it2->x;
}

因此,它需要知道struct punto的定义。
如果你不想让struct punto的定义被人知道,你需要提供一种访问其成员的替代方法。例如:
Stack overflow - what defines an opaque type in c
一个一个二个一个一个一个三个一个一个一个一个一个四个一个
谢谢@Someprogrammerdude的想法。

相关问题