| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6947 人关注过本帖, 6 人收藏
标题:关于C语言多文件编写的一点小小总结
只看楼主 加入收藏
zhangqi_gsts
Rank: 6Rank: 6
来 自:甘肃天水
等 级:侠之大者
威 望:1
帖 子:227
专家分:457
注 册:2011-3-27
结帖率:87.5%
收藏(6)
 问题点数:0 回复次数:4 
关于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类型的。
搜索更多相关主题的帖子: C语言 include 嵌入式 
2012-06-22 13:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
多实践,过一段日子回头再看看自己这篇小总结,希望有新的感受。我把你这篇东西收藏起来,看你以后有没有跟进。

授人以渔,不授人以鱼。
2012-06-22 13:50
o010o
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-6-8
收藏
得分:0 
支持一下,我还是新手级别, 。。呵呵。。
2012-06-23 01:14
小糊涂神c30
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:198
专家分:809
注 册:2012-4-25
收藏
得分:0 
技术还没那么好,有点不太理解!先收藏了···
2012-06-23 01:26
jpaekeo
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-4-6
收藏
得分:0 
楼主的结构体类型变量定义属于第二种:定义结构体类型的同时定义结构体类型变量。
2016-06-09 21:08
快速回复:关于C语言多文件编写的一点小小总结
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027175 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved