我在构建一个非常基本的项目时遇到问题。编译器似乎认为我没有定义某种类型,尽管该类型是明确定义的。当我运行
make
时,出现以下错误:
gcc -Wall -pedantic -std=c11 -c -o set.o set.c
gcc -Wall -pedantic -std=c11 -c -o driver.o driver.c
driver.c:12:9: error: variable has incomplete type 'set_t' (aka 'struct set')
set_t hey;
^
./set.h:10:16: note: forward declaration of 'struct set'
typedef struct set set_t;
^
1 error generated.
这是我的 makefile:
# Makefile for groups
PROG = driver
HEADERS = set.h
OBJS = driver.o set.o
CC = gcc
CFLAGS = -Wall -pedantic -std=c11
$(PROG): $(OBJS)
$(CC) $(CFLAGS) $^ -o $@
driver.o: set.h set.o
set.o: set.h
.PHONY: clean
clean:
rm -f *.o
驱动程序.c:
#include <stdio.h>
#include "set.h"
int main (int argc, char* argv[])
{
set_t hey;
return 0;
}
设置.h:
#ifndef __SET_H
#define __SET_H
typedef struct set set_t;
set_t* set_new();
#endif
设置.c:
#include "set.h"
#include <stdlib.h>
typedef struct set {
int size;
void** items;
} set_t;
任何帮助将不胜感激!
您可能知道,#include headers 几乎意味着复制粘贴整个文件。
让我们看看如果我们复制粘贴
driver.c
会发生什么:驱动程序.c:
set.h
现在我们已经解决了这个问题,让我们关注这一行:
#include <stdio.h>
#ifndef __SET_H
#define __SET_H
typedef struct set set_t;
set_t* set_new();
#endif
int main (int argc, char* argv[])
{
set_t hey;
return 0;
}
此别名类型
typedef struct set set_t;
为
struct set
,但是,由于之前的代码中未遇到 set_t
,因此它也充当前向声明。让我们让这个声明更加明显一点:struct set
前瞻性声明可以让我们做什么?获取指向相关结构的指针。它不允许我们做什么?创建该类型的对象。我们可以看到这正是我们在
struct set;
typedef struct set set_t;
:
中尝试做的事情
main
每当声明结构时,您都在头文件中声明整个结构,以及所有 typedef 和函数原型。 .c 文件应该只包含这些函数的定义。让我们更正您的代码:
驱动程序.c:
set_t hey; //attempting to create a new object, but fails because the compiler doesn't have all the necessary information about the structure
//the compiler only knows that the structure exists
设置.h:
#include <stdio.h>
#include "set.h"
int main (int argc, char* argv[])
{
set_t hey;
return 0;
}
设置.c:
#ifndef __SET_H
#define __SET_H
typedef struct set {
int size;
void** items;
} set_t;
set_t* set_new();
#endif