Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结构不能在多个C源文件上工作_C - Fatal编程技术网

结构不能在多个C源文件上工作

结构不能在多个C源文件上工作,c,C,我一直在寻找如何正确地做到这一点,但我发现的解决方案或解释仍然没有一个奏效。我在rsort.c中有我的主要功能: #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #include "records.h" #define NAMESIZE 20 #define BLOCK 2 #define LINESIZE 512 typedef stru

我一直在寻找如何正确地做到这一点,但我发现的解决方案或解释仍然没有一个奏效。我在rsort.c中有我的主要功能:

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include "records.h"
#define NAMESIZE 20
#define BLOCK 2
#define LINESIZE 512

typedef struct name{
char last[NAMESIZE];
char first[NAMESIZE];
} name;

typedef struct record{
name name;
int score;
} record;

typedef struct record_list{
record *data;   
size_t nalloc;  
size_t nused;   
} record_list;

int main(void) {
record_list a;
record *ab = malloc(sizeof(record));
}
最后记录.c,其中出现了我的所有错误:

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include "records.h"

struct name name;
struct record record;
struct record_list record_list;

int list_compare(const void * left, const void * right) {
const record * a = (const record *) left;
const record * b = (const record *) right;
}
#包括
#包括
#包括
#包括
#包括“records.h”
结构名称;
结构记录;
结构记录列表记录列表;
int list_比较(常量无效*左,常量无效*右){
常量记录*a=(常量记录*)左侧;
常量记录*b=(常量记录*)右侧;
}
这样,我在bashshell上得到了大约5个屏幕的错误。我正在使用GCC。我尝试过以多种不同的方式重新排列结构,但在record.c的前几行仍然得到相同的“type name not found error”。我真的不明白转发声明应该放在哪里,在将它们移动到rsort.c之前,我在.h文件中有了结构,没有任何实际的更改。在这一点上,我只想知道哪些行/块去了哪里,如何写,因为对更改内容的模糊描述并不能真正帮助我。我试着从这个网站上的帖子中为其他人提供模糊的建议,但这并没有让我走多远


对我来说,将结构放在头文件中是最有意义的,但我无法让它正常工作。这个问题很可能与记录无关,因为错误似乎只是来自记录,尽管我很难说,因为它产生的错误超过了我的计数。第一个错误总是抱怨我的结构中使用的类型找不到。当所有代码都在一个文件中时,这段代码确实可以工作,但我需要使用多个源文件,所以这就是我正在做的。我还通过清空显示所需的函数和删除与问题无关的函数,删除了保留工作的功能。谢谢阅读。

我不认为records.h应该包含“records.c”。我自己还没有试过,但那应该可以解决它


通常,您只需要
#包含
.h文件。

头文件中需要提供结构的完整定义。另外,请不要包括c文件

rsort.c

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "records.h"

int main(void) {
    record_list a;
    record *ab = malloc(sizeof(record));
}
#包括
#包括
#包括
#包括“records.h”
内部主(空){
记录清单a;
记录*ab=malloc(sizeof(记录));
}
记录

#ifndef RECORDS_H
#define RECORDS_H
#include <stdlib.h>

#define NAMESIZE 20
#define BLOCK 2
#define LINESIZE 512

typedef struct name {
    char last[NAMESIZE];
    char first[NAMESIZE];
} name;

typedef struct record {
    name name;
    int score;
} record;

typedef struct record_list {
    record *data;   
    size_t nalloc;  
    size_t nused;   
} record_list;

int list_compare(const void *left, const void *right);
#endif
\ifndef记录
#定义记录
#包括
#定义名称20
#定义块2
#定义线宽512
typedef结构名{
最后一个字符[命名];
字符优先[命名];
}姓名;
类型定义结构记录{
姓名;
智力得分;
}记录;
类型定义结构记录列表{
记录*数据;
大小;
使用的尺寸;
}记录表;
int list_比较(常量无效*左,常量无效*右);
#恩迪夫
记录c

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "records.h"

int list_compare(const void * left, const void * right) {
    const record * a = (const record *) left;
    const record * b = (const record *) right;
}
#包括
#包括
#包括
#包括“records.h”
int list_比较(常量无效*左,常量无效*右){
常量记录*a=(常量记录*)左侧;
常量记录*b=(常量记录*)右侧;
}

typedef结构记录{}记录在一个头文件中,
结构记录在另一个中,然后
结构记录。您似乎对
struct
s和
typedef
都有相当严重的误解。您似乎将
record
定义为一个类型,然后尝试定义一个名为
record
的变量。你不能这么做。你提到了转发声明,但你没有。您最终会在其自身包含一个
.c
文件。这很奇怪。除了定义任何同名变量的文件外,还需要在文件中声明它们
extern
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include "records.h"

int list_compare(const void * left, const void * right) {
    const record * a = (const record *) left;
    const record * b = (const record *) right;
}