你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

永远不要再.h文件中定义变量----->转载一篇博客

[复制链接]
在路上11111111 发布时间:2017-4-5 08:49
C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能,C语言模块化程序设计需理解如下概念:

    (1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明

    (2) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;

    (3) 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;

    (4) 永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。如:


int a = 5;

#include "module1.h"

#include "module1.h"

#include "module1.h"

  以上程序的结果是在模块1、2、3中都定义了整型变量a,a在不同的模块中对应不同的地址单元,这个世界上从来不需要这样的程序。正确的做法是:


extern int a;

#include "module1.h" int a = 5;

#include "module1.h"

#include "module1.h"

这样如果模块1、2、3操作a的话,对应的是同一片内存单元。



http://blog.chinaunix.net/uid-27656723-id-3345302.html
收藏 1 评论28 发布时间:2017-4-5 08:49

举报

28个回答
myfocus-2048857 回答时间:2017-4-5 10:13:14
很好,顶起,谢谢共享
斜阳__ 回答时间:2017-4-5 10:23:31
#program once
五哥1 回答时间:2017-4-5 11:28:29
好的,谢谢分享
zero99 回答时间:2017-4-5 12:55:01
楼主我把文章内容放上来了,方便阅读
在路上11111111 回答时间:2017-4-5 18:24:32

这个是什么用法,没见过,求指教
霹雳之火 回答时间:2017-4-5 18:35:53
在路上11111111 发表于 2017-4-5 18:24
这个是什么用法,没见过,求指教

参考 http://blog.csdn.net/jfkidear/article/details/7868662
没用过 学习 学习
在路上11111111 回答时间:2017-4-5 18:43:10
霹雳之火 发表于 2017-4-5 18:35
参考 http://blog.csdn.net/jfkidear/article/details/7868662
没用过 学习 学习

我也搜了搜,嘿嘿,看样子和ifndef define差不多
中山无雪 回答时间:2017-4-5 19:04:12
关于在头文件中定义变量出现重复分配的问题解决方法很多,但是有经验的C(C++)工程师是不会在头文件中定义变量的,虽然没有明确的规则(或规范)说不能在头文件中定义变量,但是在学习C语言时关于头文件(.h)和内容文件(.c)的分工讲的是十分明确的,写程序应该养成好的风格,遵守书写的基本规范,只有这样程序才清晰明了,也易于以后的维护。
斜阳__ 回答时间:2017-4-5 21:08:15
中山无雪 发表于 2017-4-5 19:04
关于在头文件中定义变量出现重复分配的问题解决方法很多,但是有经验的C(C++)工程师是不会在头文件中定义 ...

正解,只有声明,不定义
123下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版