C语言 如何使用另一个源文件中已定义的结构体?

hujrc8aj  于 2023-01-29  发布在  其他
关注(0)|答案(7)|浏览(963)

我使用Linux作为我的编程平台,C语言作为我的编程语言。
我的问题是,我在主源文件(main.c)中定义了一个结构:

struct test_st
{
   int state;
   int status;
};

所以我想在其他源文件中使用这个结构(例如othersrc.)。有没有可能在其他源文件中使用这个结构而不把它放在头文件中?

jvlzgdj9

jvlzgdj91#

您可以在每个源文件中定义struct,然后将示例变量声明一次为全局变量,再声明一次为外部变量:

// 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;
ckocjqey

ckocjqey2#

您可以在othersrc.c中使用指向它的指针而不包含它:
其他来源c:

struct foo
{
  struct test_st *p;
};

但除此之外,您需要以某种方式包含结构定义。一个好方法是在main. h中定义它,并将其包含在两个. c文件中。
主. h:

struct test_st
{
   int state;
   int status;
};

主要c:

#include "main.h"

其他来源c:

#include "main.h"

当然,您可能会找到比main. h更好的名称

fd3cxomn

fd3cxomn3#

// 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);
dwthyt8l

dwthyt8l4#

将其放在头文件中是声明源文件之间共享的类型的正常、正确的方法。
除此之外,您可以将main. c视为头文件,并将其包含在另一个文件中,然后只编译另一个文件;或者您可以在两个文件中声明相同的struct,并在两个位置都进行修改。

kuuvgm7e

kuuvgm7e5#

C支持separate compilation
将结构声明放在一个 * 头文件 * 中,将#include "..."放在源文件中。

wvt8vs2t

wvt8vs2t6#

将struct保留在源文件中是完全合理的,这就是封装,但是如果你要在多个源文件中多次重新定义struct,那么你最好在头文件中定义一次struct,然后根据需要包含该文件。

5vf7fwbs

5vf7fwbs7#

头文件/* 在file1.c和file2.c中都包含此头文件

struct a {

};

struct b {

};

因此头文件包含两个结构的声明。

file 1.c

struct a xyz[10];--〉此处定义的结构体a
在此文件中使用结构B

extern struct b abc[20];

/* now can use in this file */

file2.c

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

使用file1.c中定义的结构a

use extern struct a xyz[10]

相关问题