我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 859|回复: 8

C语言多文件编写的小小总结

[复制链接]

该用户从未签到

77

主题

359

回帖

0

积分

二级逆天

积分
0

社区居民终身成就奖金点子奖

QQ
发表于 2021-6-28 15:48:40 | 显示全部楼层 |阅读模式
[/free][paragraph]

C语言多文件编写的小小总结




关于C语言多文件编写的一点小小总结
在多文件编写中,变量,尤其的全局变量的定义和引用显得不那么精简。很多人可能会想,把全局变量放在一个*.h文件中,然后在以后的调用中只要include一下不就可以了?想想也有道理,include不就是把*.h原封不动的复制过来吗?但是,这样存在一个问题。加入定义了10个全局变量,而在具体一个*.c文件中我只用其中一个。如果用include把全局变量全都包含进来。那利用率不就才是10%吗。而且C语言常用于嵌入式,如果每个文件都include一个全局变量头文件,那么这些变量就被分配一次内存,这对嵌入式来说肯定是致命的;另外,如果有很多个文件都include了全局变量的头文件,编译器要跟踪每一个文件对其中一个变量的更改,这对编译器来说也是吃不消的。

      所以便有了*.c和*.h的区别。

      很多人都知道声明和定义的区别——一个分配内存,一个不分配内存,而且函数的声明和定义更是显而易见,但是对于变量的声明和定义,就显得有些模糊不清。由于如上所述的种种原因,C语言中全局变量放在*.c文件,而不放在*.h文件。这样一来,*.h文件好像无用武之地了,非也。我们经常见到#include "****.h",但有谁见过#include "***.c"吗?所以*.h文件用来声明,*.c文件用来实现,在调用处用extern声明。

        1、普通变量定义成全局变量

        如果是普通类型,完全可以不用*.h文件,直接在*.c文件中定义,在调用文件处用extern 声明,因为对于普通类型,编译器是可以识别的。比如在一个 my.c文件中,我定义了char name[10];那么在别的文件中只要用extern char name[](由于是声明,一位数组可以省略大小,但不建议用指针,比较指针和数组是两回事)外部声明就可以了,告诉编译器这个变量我已经定义过了,具体怎样,你慢慢找吧。这符合常理,因为char是编译器能自主识别的类型。

        2、自定义结构体类型定义成全局变量

        不同于普通类型,如果不预先通知编译器,编译器是不会识别你自定义的类型的。这个时候,*.h文件便出现了。不是定义结构类型不占内存吗?那好,我大结构体的定义放在*.h文件中,这样一来,无论你incude无数次,内存都不会被占用的。而且这样还有个好处,在别的文件中可以include这个*.h文件,这样,在这个文件中,编译器就可以识别你的自定义类型了,目的不就达到了?  假如我在global.h中定义了

typedef struct _POSITION

{

        int x;

        int y;

}POSITION;

那么我可以在一个global.c文件中实现全局变量的定义,不过要include那个*.h文件,比如

/* ***global.c ******* */

include “global.h”

POSITION current,;  

这样就定义了cunrrent这个变量,在别的文件中引用这个变量时,只要extern POSITION current;进行声明,然后就可以用了,不过这个文件也还得include "global.h" 因为如果不包含,在这个文件中是不识别POSITION类型的。






来源网络仅供学习交流
[free]
购买主题 本主题需向作者支付 1 枚金币 才能浏览
回复

使用道具 举报

该用户从未签到

77

主题

359

回帖

0

积分

二级逆天

积分
0

社区居民终身成就奖金点子奖

QQ
 楼主| 发表于 2021-7-7 01:04:06 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

77

主题

359

回帖

0

积分

二级逆天

积分
0

社区居民终身成就奖金点子奖

QQ
 楼主| 发表于 2021-7-19 01:11:42 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

0

主题

1

回帖

0

积分

一级逆天

积分
0

终身成就奖

发表于 2021-7-21 11:36:57 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

77

主题

359

回帖

0

积分

二级逆天

积分
0

社区居民终身成就奖金点子奖

QQ
 楼主| 发表于 2021-7-28 00:14:48 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

77

主题

359

回帖

0

积分

二级逆天

积分
0

社区居民终身成就奖金点子奖

QQ
 楼主| 发表于 2021-7-30 00:29:39 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

77

主题

359

回帖

0

积分

二级逆天

积分
0

社区居民终身成就奖金点子奖

QQ
 楼主| 发表于 2021-8-15 01:55:43 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

77

主题

359

回帖

0

积分

二级逆天

积分
0

社区居民终身成就奖金点子奖

QQ
 楼主| 发表于 2021-8-31 00:41:45 | 显示全部楼层
回复

使用道具 举报

该用户从未签到

77

主题

359

回帖

0

积分

二级逆天

积分
0

社区居民终身成就奖金点子奖

QQ
 楼主| 发表于 2021-9-1 00:51:23 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

论坛开启做任务可以
额外奖励金币快速赚
积分升级了


Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

平平安安
TOP
快速回复 返回顶部 返回列表