C - 头文件中的结构定义
C - struct definition in header files
我有这两个结构,它们的头文件随附。
我的结构编号 1 是:
头文件'list.h':
typedef struct list * List;
源文件'list.c':
struct list {
unsigned length;
char * value;
};
我的结构编号 2 是:
头文件'bal.h':
typedef enum {START, END, MIDDLE, COMMENTS, CONDITIONS} TypeListBal;
typedef struct bal * Bal;
源文件'bal.c':
i've include those header files :
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "list.h"
struct bal {
TypeListBal type;
List name; // Name of the bal
List attributes[]; // Array of type struct List
};
当我尝试在我的 bal.c 文件中使用函数时,例如:
Bal createBal(List name){
char * search;
const char toFind = '=';
search = strchr(name->value, toFind);
}
我在这一行遇到错误:search = strchr(name->value, toFind);
说:错误:取消引用指向不完整类型的指针
我不知道为什么,因为我已经在 bal.c
中添加了 list.h
我在 Whosebug 上读了很多书,说这种类型的编程叫做:不透明类型
这似乎非常好,但我不知道如何将我的其他头文件用于其他源文件。
我认为我所要做的就是将我的 list.h 包含在我的 bal.c 文件中。
我正在 gcc 中使用此命令进行编译:gcc -g -W -Wall -c bal.c bal.h
非常感谢!
.h文件只有struct
和typedef
的声明。
typedef struct list * List;
这并没有提供任何关于 struct
成员的线索。它们在 .c 文件中是 "hidden"。当编译器编译bal.c
时,它无法知道struct list
有一个成员value
.
您可以通过两种方式解决此问题:
- 将
struct list
的定义也放在.h文件中。
- 提供可以 get/set
struct list
对象的值的函数。
当您包含头文件时,这就是您所做的一切。在您的头文件中,您只有一行:
typedef struct list * List;
试图从 main 中使用这个结构会导致编译器抱怨类型不完整,因为从源文件的角度来看,这个结构没有成员。事实上它根本没有定义。
您需要输入:
struct list;
typedef struct list * List;
在你的头文件中。但是,请注意,此过程会创建一个不透明的结构!这意味着做例如
List l1;
l1->data = 0; //error
不允许,因为编译器只看到头文件中包含的内容。在该编译单元中,结构中不存在变量。
这个 可以 被有意使用,以强制用户通过 getters/setters 您的数据类型。像
int data = ListStuff_Get_Item1(l1);
可以,但是ListStuff_Get_Item1()函数需要在.h中声明,在.c中定义
我有这两个结构,它们的头文件随附。
我的结构编号 1 是:
头文件'list.h':
typedef struct list * List;
源文件'list.c':
struct list {
unsigned length;
char * value;
};
我的结构编号 2 是:
头文件'bal.h':
typedef enum {START, END, MIDDLE, COMMENTS, CONDITIONS} TypeListBal;
typedef struct bal * Bal;
源文件'bal.c':
i've include those header files :
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include "list.h"
struct bal {
TypeListBal type;
List name; // Name of the bal
List attributes[]; // Array of type struct List
};
当我尝试在我的 bal.c 文件中使用函数时,例如:
Bal createBal(List name){
char * search;
const char toFind = '=';
search = strchr(name->value, toFind);
}
我在这一行遇到错误:search = strchr(name->value, toFind);
说:错误:取消引用指向不完整类型的指针
我不知道为什么,因为我已经在 bal.c
中添加了 list.h我在 Whosebug 上读了很多书,说这种类型的编程叫做:不透明类型 这似乎非常好,但我不知道如何将我的其他头文件用于其他源文件。 我认为我所要做的就是将我的 list.h 包含在我的 bal.c 文件中。
我正在 gcc 中使用此命令进行编译:gcc -g -W -Wall -c bal.c bal.h
非常感谢!
.h文件只有struct
和typedef
的声明。
typedef struct list * List;
这并没有提供任何关于 struct
成员的线索。它们在 .c 文件中是 "hidden"。当编译器编译bal.c
时,它无法知道struct list
有一个成员value
.
您可以通过两种方式解决此问题:
- 将
struct list
的定义也放在.h文件中。 - 提供可以 get/set
struct list
对象的值的函数。
当您包含头文件时,这就是您所做的一切。在您的头文件中,您只有一行:
typedef struct list * List;
试图从 main 中使用这个结构会导致编译器抱怨类型不完整,因为从源文件的角度来看,这个结构没有成员。事实上它根本没有定义。
您需要输入:
struct list;
typedef struct list * List;
在你的头文件中。但是,请注意,此过程会创建一个不透明的结构!这意味着做例如
List l1;
l1->data = 0; //error
不允许,因为编译器只看到头文件中包含的内容。在该编译单元中,结构中不存在变量。
这个 可以 被有意使用,以强制用户通过 getters/setters 您的数据类型。像
int data = ListStuff_Get_Item1(l1);
可以,但是ListStuff_Get_Item1()函数需要在.h中声明,在.c中定义