我正在构建一个我正在尝试组织的项目,如下所示:
main.c
globals.h
structures.h
FunctionSet1.c, FunctionSet1.h
FunctionSet2.c, FunctionSet2.h
etc.
我以为我可以在structures.h中定义一个结构类型:
struct type_struct1 {int a,b;}; // define type 'struct type_struct1'
然后在FunctionSet1.h中声明function1()
返回类型为type_struct1
的结构:
#include "structures.h"
struct type_struct1 function1(); // declare function1() that returns a type 'struct type_struct1'
然后在FunctionSet1.c中写function1()
:
#include "FunctionSet1.h"
struct type_struct1 function1() {
struct type_struct1 struct1; // declare struct1 as type 'struct type_struct1'
struct1.a=1;
struct1.b=2;
return struct1;
}
编辑:使用上面更正的代码,编译器返回
306 'struct' tag redefined 'type_struct1' structures.h
文件设置是否良好? 管理结构的好习惯是什么?
答案 0 :(得分:1)
在您的示例中,您在structure.h中声明了一个名为type_struct的结构,然后在FunctionSet1.h中,您返回的结构是type_struct,而在.c中它被称为struct1。
所以我认为问题是struct1和type_struct无法识别,因为它们从未被定义过......
但是,您的文件组织还可以。
答案 1 :(得分:0)
首先,您必须在file.h
中声明结构(您可以使用typedef
创建别名)
typedef struct Books
{
char title[50];
int book_id;
} books;
然后,您必须在file.h
中加入file.c
并声明您的变量
#include "file.h"
int main()
{
books book1;
book1.title = "Harry Potter";
book1.book_id = 54;
}
或者像这样,如果你没有使用typedef
#include "file.h"
int main()
{
struct Books book1;
book1.title = "Harry Potter";
book1.book_id = 54;
}
答案 2 :(得分:0)
您的总体结构看起来不错。正如天顶所提到的,你需要做的一件事就是将包含防护装置放入头文件中。那是一组#define,它确保标题的内容不会包含在给定文件中的一次。例如:
structures.h:
#ifndef STRUCTURES_H
#define STRUCTURES_H
struct type_struct1{
int a,b;
};
...
// more structs
...
#endif
FunctionSet1.h:
#ifndef FUNCTION_SET_1_H
#define FUNCTION_SET_1_H
#include "structures.h"
struct type_struct1 function1();
...
// more functions in FucntionSet1.c
...
#endif
main.c中:
#inlcude <stdio.h>
#include "structures.h"
#include "FunctionSet1.h"
int main(void)
{
struct type_struct1 struct1;
struct1 = function1();
return 0;
}
这里,main.c包含structures.h和FunctionSet1.h,但FunctionSet1.h还包含structures.h。如果没有包含保护,则在完成预处理程序后,results.h的内容将在结果文件中出现两次。这可能是您重新定义&#34;标签重新定义的原因。错误。
包含警卫可防止发生此类错误。然后,您不必担心是否包含特定的头文件。如果您正在编写库,其他用户可能不知道您的头文件之间的关系,这一点尤为重要。
答案 3 :(得分:0)
谢谢大家。
我再次阅读你所说的内容,发现上面的代码现在是正确的。 我报告的错误是测试以下main.c
#include "structures.h"
#include "FunctionSet1.h"
void main() {
struct type_struct1 struct2;
struct2=function1();
}
再次包含structures.h,从而导致错误。删除包含可以消除错误。
我现在将调查标题保护以避免此类问题。
再次感谢。