如何使用另一个源文件中定义的结构?

时间:2010-06-15 00:14:49

标签: c linux

我使用Linux作为编程平台,使用C语言作为编程语言。

我的问题是,我在主源文件(main.c)中定义了一个结构:

struct test_st
{
   int state;
   int status;
};

所以我想在我的其他源文件中使用这个结构(例如others.c.)。是否可以在另一个源文件中使用此结构而不将此结构放在标题中?

7 个答案:

答案 0 :(得分:15)

您可以在每个源文件中定义结构,然后将实例变量声明为一次全局,将一次声明为extern:

// File1.c
struct test_st
{
   int state;
   int status;
};

struct test_st g_test;

// File2.c
struct test_st
{
   int state;
   int status;
};

extern struct test_st g_test;

然后链接器将执行魔术,两个源文件都将指向同一个变量。

但是,在多个源文件中复制定义是一种糟糕的编码习惯,因为如果发生更改,您必须手动更改每个定义。

简单的解决方案是将定义放在头文件中,然后将其包含在使用该结构的所有源文件中。要跨源文件访问结构的同一实例,您仍然可以使用extern方法。

// Definition.h
struct test_st
{
   int state;
   int status;
};

// File1.c
#include "Definition.h"
struct test_st g_test;

// File2.c
#include "Definition.h"  
extern struct test_st g_test;

答案 1 :(得分:13)

您可以在othersrc.c中使用指针,而不包括它:

othersrc.c:

struct foo
{
  struct test_st *p;
};

但是否则你需要以某种方式包含结构定义。一个好方法是在main.h中定义它,并将它包含在.c文件中。

main.h:

struct test_st
{
   int state;
   int status;
};

main.c中:

#include "main.h"

othersrc.c:

#include "main.h"

当然,你可能找到一个比main.h更好的名字

答案 2 :(得分:4)

将它放在头文件中是声明源文件之间共享类型的正常,正确方法。

除此之外,您可以将main.c视为头文件并将其包含在另一个文件中,然后只编译另一个文件。或者你可以在两个文件中声明相同的结构,并在自己的两个地方留下一个注释来改变它。

答案 3 :(得分:3)

// use a header file.  It's the right thing to do.  Why not learn correctly?

//in a "defines.h" file:
//----------------------

typedef struct
{
   int state; 
   int status; 
} TEST_ST; 


//in your main.cpp file:
//----------------------

#include "defines.h"

TEST_ST test_st;


    test_st.state = 1;
    test_st.status = 2;




//in your other.ccp file:

#include "defines.h"

extern TEST_ST test_st;

   printf ("Struct == %d, %d\n", test_st.state, test_st.status);

答案 4 :(得分:2)

C支持separate compilation

将结构声明放入标题文件中,并将#include "..."放入源文件中。

答案 5 :(得分:0)

头文件/ *在file1.c和file2.c

中包含此头文件
strcut a {

};

struct b {

}; 

所以头文件包含两种结构的声明。

file 1.c 

strcut a xyz[10]; - > struct a here here

在此文件中使用struct b

extern struct b abc[20];

/* now can use in this file */

file2.c

strcut b abc[20]; /* defined here */

使用file1.c中定义的strcut

use extern struct a xyz[10]

答案 6 :(得分:0)

通过将结构保留在源文件中来包含结构是完全合理的。这是封装。但是,如果要在多个源文件中多次重新定义结构,则最好在头文件中定义一次结构,并根据需要包含该文件。