我试图创建一个创建点列表的代码。我有一个名为“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的指针,但它不起作用。(部分代码是意大利语,抱歉:))
2条答案
按热度按时间8oomwypt1#
标头
punti.h
声明名称Punto
作为指针类型struct punto *
到不完整类型struct punto
的别名。此头文件包含在头文件
item.h
中,其中声明了typedef名称item
,作为在函数eq
的参数声明列表中使用的typedef名称Punto
的别名:typedef名称Punto和item仍然表示指向不完整结构类型的指针类型。它们可以在函数声明中使用,因为指针本身总是完整类型。
但是在模块
item.c
中,在函数eq
的定义中,使用表达式来访问不完整结构类型struct punto
的数据成员此时,编译器不知道结构
struct punto
是否确实包含数据成员x
。因此它会发出错误。您需要在试图访问结构的数据成员的模块中包含完整的结构声明。否则编译器将报告错误。w46czmvw2#
struct punto
的定义需要为item.c
所知(例如,包含在punti.h
中)。你可以把typedef看作一个别名。“typedef声明提供了一种方法来声明一个标识符作为类型别名,用于替换可能复杂的类型名”(cppreference)。编译器几乎只是用它定义的内容替换typedef。你的函数相当于:
因此,它需要知道
struct punto
的定义。如果你不想让
struct punto
的定义被人知道,你需要提供一种访问其成员的替代方法。例如:Stack overflow - what defines an opaque type in c
一个一个二个一个一个一个三个一个一个一个一个一个四个一个
谢谢@Someprogrammerdude的想法。