compiler-errors - C:“无效使用未定义类型'struct X'&解除指向不完整类型的指针“错误

  显示原文与译文双语对照的内容

我一直在寻找几天的类似问题,但还没有找到解决方案。 感谢你的帮助:

我有两个文件,一个包含处理有理数和在 2维 array 中处理它们的方法。 我的问题是 matrix.c 无法识别 fraction.c. 中的分数结构,我相信我的问题与我声明的2d array的方式有些关联。

在 fraction.c 中:


struct fraction {


 int integer;


 int num;


 int den;


};


typedef struct fraction* fractionRef;//This line is in fraction.h



在 matrix.c 中:


#include"fraction.h"



typedef struct matrix* matrixRef;



struct matrix {


 int rows;


 int columns;


 fractionRef *m;


}matrix;



matrixRef new_matrix ( int rows, int columns ) {


 matrixRef matrix;


 matrix = (matrixRef)malloc( sizeof( matrix ) );


 matrix->m = (fractionRef*)calloc( rows, sizeof( fractionRef ) );


 int i;


 for ( i=0; i<=rows; i++ )


 matrix->m[i] = (fractionRef)calloc( columns, sizeof( fractionRef ) );


 assert( matrix->m );


 return matrix;



}


void free_matrix ( matrixRef freeMe ) {


 if ( freeMe!= NULL ){


 int i, j;


 for( i = 0; i <= freeMe->rows; i++ ){


 for ( j = 0; j <= freeMe->columns; j++ ){


 free_fraction( freeMe->m[i][j] );//ERROR OCCURS HERE


 }


 }


 freeMe->rows = 0;


 freeMe->columns = 0;


 free(freeMe);


 freeMe = NULL;


 }


}



我得到的错误与 matrix.c 中的行对应。


matrix.c:47: error: invalid use of undefined type 'struct fraction'


matrix.c:47: error: dereferencing pointer to incomplete type



这可能都是因为我在c 之前学习了 java,大错误 ! 感谢你的帮助。

编辑:感谢大家。我现在看到的是头. h 文件中的所有内容都类似于java中的public 。 对于c 编译器,我的分数结构定义不是"public",所以我的matrix.c 不能访问它。

时间:

你必须将 struct的定义移到 fraction.h 文件中。 Java不同,编译器和链接器不"神奇"导致一个 .c 文件引用另一个 .c 文件中的信息。 ( 如果你在另一个中使用一个. c 文件,这是个不错

指令

#include"fraction"

导致标头文件的文本内容,如由cut-and-paste在具有该指令的行处的文本内容。 编译器一次处理一个输入文件,读取 #include 文件,并且必须在编译一个 .c 文件时存在所有信息。

为了帮助你理解,我将指出一种实现所需内容的可怕方法: 简单地将的结构定义转换为 matrix.c的顶部,在 #include"fraction.h" --之前,结果将会编译。 在Java中,编译器可能会抱怨你声明了一些重复类型。 在C 中,你所做的是定义两个不同的结构,它们有一个相同的内存布局和相同的NAME 。 只有相同的内存布局才能使它们从链接对象文件的角度成为 interchangable 。

是的,这是你从Java中提取的误解。 你正在学习C !

...