在C项目中声明和使用结构的正确方法?

时间:2015-07-08 09:53:18

标签: c file header structure

我正在构建一个我正在尝试组织的项目,如下所示:

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

文件设置是否良好? 管理结构的好习惯是什么?

4 个答案:

答案 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,从而导致错误。删除包含可以消除错误。

我现在将调查标题保护以避免此类问题。

再次感谢。