我使用Linux作为编程平台,使用C语言作为编程语言。
我的问题是,我在主源文件(main.c)中定义了一个结构:
struct test_st
{
int state;
int status;
};
所以我想在我的其他源文件中使用这个结构(例如others.c.)。是否可以在另一个源文件中使用此结构而不将此结构放在标题中?
答案 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)
将结构声明放入标题文件中,并将#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)
通过将结构保留在源文件中来包含结构是完全合理的。这是封装。但是,如果要在多个源文件中多次重新定义结构,则最好在头文件中定义一次结构,并根据需要包含该文件。