C语言中怎样调用其他文件定义的结构体

本文详细介绍了如何在C语言中定义和调用结构体,包括直接定义结构体变量、定义结构体指针变量以及使用typedef简化结构体定义的方法。

该死的结构体,折腾了哥快两小时!!!在此总结一下。

假设a.h文件定义结构体:

struct test
{
	int a;
	int b;
};

那么要在b.c文件中调用该怎么写呢?

需要两步:

1、头文件包含

#include "a.h"

2、先定义一个结构体变量(注意是定义,不是声明)

struct test c;

2、在b.c文件中声明要调用的结构体变量(注意是声明,声明为全局变量)

extern struct test c;

3、然后就可以给结构体成员赋值

/*成员赋值*/
c.a = 1;
c.b = 2;

当然,如果变量定义为结构体指针变量,则变成如下:

/*定义*/
struct test *c;

/*声明*/
extern struct test *c;

/*成员赋值*/
c->a = 1;
c->b = 2;

另外还有另一个变种,使用typedef 定义结构体

typedef struct test
{
	int a;
	int b;
}result;

/*定义*/
result c;

/*声明*/
extern result c;

/*成员赋值*/
c.a = 1;
c.b = 2;

result是一个结构体类型,不是结构体变量,定义变量like this  :result  y0,y1;y0、y1才属于结构体变量。实际上 result = struct test


在C语言中,如果一个结构体定义在一个 `.c` 文件内部,那么该结构体默认只在该文件中可见,其他源文件无法访问该结构体定义,也就无法直接使用该结构体类型。为了解决这个问题,需要将结构体定义放在一个头文件(`.h` 文件)中,并在需要使用该结构体的 `.c` 文件中包含该头文件。 ### 结构体定义在 `.c` 文件中无法被访问的原因 C语言中每个 `.c` 文件是独立编译的翻译单元,编译器在编译某个 `.c` 文件时,不会自动知道其他 `.c` 文件定义的内容。因此,如果结构体定义仅存在于某个 `.c` 文件中,则其他 `.c` 文件在编译时无法识别该类型,从而导致编译错误。 ### 解决方案 #### 1. 将结构体定义放入头文件结构体定义放在 `.h` 文件中,例如定义如下结构体: ```c // person.h #ifndef PERSON_H #define PERSON_H struct Person { char name[50]; int age; }; #endif // PERSON_H ``` #### 2. 在多个 `.c` 文件中包含该头文件 然后在多个 `.c` 文件中通过 `#include` 引入该头文件: ```c // main.c #include "person.h" #include <stdio.h> int main() { struct Person p1; p1.age = 30; strcpy(p1.name, "Alice"); printf("Name: %s, Age: %d\n", p1.name, p1.age); return 0; } ``` ```c // another_file.c #include "person.h" void print_person(struct Person *p) { printf("Name: %s, Age: %d\n", p->name, p->age); } ``` 这样,所有包含 `person.h` 的 `.c` 文件都能识别并使用 `struct Person` 类型。 #### 3. 使用 `typedef` 简化结构体声明(可选) 可以结合 `typedef` 为结构体定义别名,从而省略 `struct` 关键字: ```c // person.h #ifndef PERSON_H #define PERSON_H typedef struct { char name[50]; int age; } Person; #endif // PERSON_H ``` 使用方式如下: ```c #include "person.h" int main() { Person p; p.age = 25; strcpy(p.name, "Bob"); return 0; } ``` #### 4. 隐藏结构体定义实现封装(可选) 如果希望隐藏结构体的具体实现细节,可以使用不完整类型(incomplete type)和指针来实现封装。例如: ```c // person.h #ifndef PERSON_H #define PERSON_H typedef struct Person Person; Person* create_person(const char *name, int age); void destroy_person(Person *p); void print_person(const Person *p); #endif // PERSON_H ``` 在 `.c` 文件定义结构体的具体内容: ```c // person.c #include "person.h" #include <stdio.h> #include <stdlib.h> #include <string.h> struct Person { char name[50]; int age; }; Person* create_person(const char *name, int age) { Person *p = (Person*)malloc(sizeof(Person)); if (p != NULL) { strcpy(p->name, name); p->age = age; } return p; } void destroy_person(Person *p) { free(p); } void print_person(const Person *p) { printf("Name: %s, Age: %d\n", p->name, p->age); } ``` 通过这种方式,外部文件只能通过函数接口操作结构体,而无法直接访问其成员,从而实现了封装和信息隐藏。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值