C中的Makefile和结构

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

编辑:为了使那些乐于助人的友善者变得更容易,这里有几个链接应该使事情更清楚:

Pre-makefile repl

Post-makefile repl

有关作业的一些背景知识:我们应该采用上周编写的程序,并将这些单独的函数分解为各自的文件,并使用makefile来编译和链接所有这些东西。这是我的原始程序(基本上,它读取name number文件并将其存储在结构中,然后使用命令行参数搜索名称)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct _data {
  char* name;
  long number;
};

int SCAN(FILE *(*input)) {
  int lines = 0;
  char word[50];
  long num = 0;
  while (1) {
    fscanf(*input,"%s %ld",word, &num);
    lines++;
    if (feof(*input)) break;
  }
  return lines;
}

struct _data *LOAD(FILE *input, int size) {
  char* line = NULL;
  size_t len = 0;
  int i=0;
  rewind(input);
  struct _data *book = calloc(size,sizeof(struct _data));

  for (i = 0;i<size;i++) {
    getline(&line, &len, input);
    book[i].name = calloc(len+1,sizeof(char));
    strcpy(book[i].name,strtok(line," "));
    book[i].number = atoi(strtok(NULL, " "));
  }
  return book;
}

void SEARCH(struct _data *BlackBook, char *name, int size) {
  int i;
  for (i=0;i<size;i++) {
    if (strcmp(name,BlackBook[i].name) == 0) {
      printf("*******************************************\n");
      printf("The name was found at the %d entry.\n",i+1);
      printf("*******************************************\n");
      break;
    }
    //If we reach the end of the array and name was not found
    if (i == size-1) {
      printf("*******************************************\n");
      printf("The name was NOT found.\n");
      printf("*******************************************\n");
    }
  }
}

void FREE(struct _data *BlackBook, int size) {
  int i;
  for (i=0;i<size;i++){
    free(BlackBook[i].name);
  }
  free(BlackBook);
}

//MAIN DRIVER ===================
int main(int argv, char** argc) {

  int size;
  char* filename = "hw5.data";

  FILE *input = fopen(filename,"r");

  size = SCAN(&input);

  struct _data *phone_book = LOAD(input,size);

  fclose(input);

  //Check a name is given. If so, search
  if (argv < 2) {
    printf("*******************************************\n");
    printf("* You must include a name to search for.  *\n");
    printf("*******************************************\n");
  } else {
    SEARCH(phone_book, argc[1], size);
  }

  FREE(phone_book,size);
  return 0;
}

[制作makefile时,可以使SCANLOAD函数正常工作。但是,当我尝试将SEARCHFREE放入自己的文件中时,我的编译器吓坏了,并得到如下警告:

In file included from hw6-free.c:1:0:
hw6-free.h:9:18: warning: ‘struct _data’ declared inside parameter list
 void FREE(struct _data *BlackBook, int size);
                  ^
hw6-free.h:9:18: warning: its scope is only this definition or declaration, which is probably not what you want
hw6-free.c:3:18: warning: ‘struct _data’ declared inside parameter list
 void FREE(struct _data *BlackBook, int size) {
                  ^
hw6-free.c:3:6: error: conflicting types for ‘FREE’
 void FREE(struct _data *BlackBook, int size) {
      ^
In file included from hw6-free.c:1:0:
hw6-free.h:9:6: note: previous declaration of ‘FREE’ was here
 void FREE(struct _data *BlackBook, int size);
      ^
hw6-free.c: In function ‘FREE’:
hw6-free.c:6:5: error: invalid use of undefined type ‘struct _data’
     free(BlackBook[i].name);
     ^
hw6-free.c:6:19: error: dereferencing pointer to incomplete type ‘struct _data’
     free(BlackBook[i].name);
                   ^
Makefile:20: recipe for target 'hw6-free.o' failed
make: *** [hw6-free.o] Error 1

并仔细阅读它,看来我的程序将结构作为参数是我的主要问题吗?我的“后生成文件”程序如下所示:

#include "hw6-main.h"

int main(int argv, char** argc) {

  int size;
  char* filename = "hw5.data";

  FILE *input = fopen(filename,"r");

  size = SCAN(&input);

  struct _data *phone_book = LOAD(input,size);

  fclose(input);

  //Check a name is given. If so, search
  if (argv < 2) {
    printf("*******************************************\n");
    printf("* You must include a name to search for.  *\n");
    printf("*******************************************\n");
  } else {
    SEARCH(phone_book, argc[1], size);
  }

  FREE(phone_book,size);
  return 0;
}

我的makefile看起来像:

DEP = hw6-scan.o hw6-load.o hw6-search.o hw6-free.o hw6-main.o
HDR = hw6-scan.h hw6-load.h hw6-search.h hw6-free.h hw6-main.h
NAME = output

all: $(NAME)

output: $(DEP) $(HDR)
    gcc $(DEP) $(HDR) -o $(NAME)

hw6-scan.o: hw6-scan.c
    gcc -c hw6-scan.c

hw6-load.o: hw6-load.c
    gcc -c hw6-load.c

hw6-search.o: hw6-search.c
    gcc -c hw6-search.c

hw6-free.o: hw6-free.c
    gcc -c hw6-free.c

hw6-main.o: hw6-main.c
    gcc -c hw6-main.c

clean:
    rm *.o *.gch *.out output testfile

例如,我的hw6-free.chw6-free.h看起来像:

#include "hw6-free.h"

void FREE(struct _data *BlackBook, int size) {
  int i;
  for (i=0;i<size;i++){
    free(BlackBook[i].name);
  }
  free(BlackBook);
}

#include <stdio.h>
#include <stdlib.h>

void FREE(struct _data *BlackBook, int size);

分别。

并且,最后,我在hw6-load.h文件中定义了结构以及函数原型。这也是一个问题吗?我应该在其他地方定义它吗?

很长的帖子我很抱歉,但是我已经从事了10个小时的工作,我将把我的计算机扔到悬崖上。

谢谢您帮助堆栈溢出!

c struct makefile
2个回答
0
投票

尝试将结构声明的标头放在使用它的文件的顶部,并确保已导入包含结构声明的文件。


0
投票

我不确定你做了什么。但是要退后一步:请牢记declarations

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