“错误:变量类型不完整”链接问题

问题描述 投票:0回答:2

我在构建一个非常基本的项目时遇到问题。编译器似乎认为我没有定义某种类型,尽管该类型是明确定义的。当我运行

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;

任何帮助将不胜感激!

c makefile building
2个回答
2
投票

您可能知道,#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



0
投票

© www.soinside.com 2019 - 2024. All rights reserved.