对c语言内存的思考
来源:互联网 发布:去公司做淘宝推广员 编辑:程序博客网 时间:2024/06/05 00:18
一、C语言中变量声明与定义的区别
- 变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。
- 变量声明:(1)、 告诉编译器,这个名字已经匹配到一块内存上了,下面的代码用到变量或对象是在别的地方定义的。声明可以出现多次
(2)、 告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量名或对象名 。例如函数参数的声明extern int func (int a, int b);
如何清晰的区分变量声明和定义
extern通知编译器变量在其他地方被定义
- extern告诉编译器变量在其他地方定义了。
例如:
1 extern int i; //声明,不是定义2 int i; //声明,也是定义,未初始化
带有初始化式的声明必定式定义
2.如果声明有初始化式,就被当作定义,即使前面加了extern。 只有当extern声明位于函数外部时,才可以被初始化。
例如:
1 extern double pi=3.141592654; //定义
函数的声明和定义
函数的声明和定义区别比较简单,带有{ }的就是定义,否则就是声明。
例如:
1 extern double max(double d1,double d2); //声明
除非有extern关键字,否则都是变量的定义。
4.除非有extern关键字,否则都是变量的定义。
例如:
1 extern int i; //声明2 int i; //定义
程序模块化设计风格
概要
- 不要把变量定义放入.h文件,这样容易导致重复定义错误。
永远不要在.h文件中定义变量。定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量
尽量使用static关键字把变量定义限制于该源文件作用域,除非变量被设计成全局的。
可以在头文件中声明一个变量,在用的时候包含这个头文件就声明了这个变量。
模块化要点
(1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明;
(2) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明;
(3) 模块内的函数和全局变量需在.c文件开头冠以static关键字声明;
(4)永远不要在.h文件中定义变量!定义变量和声明变量的区别在于定义会产生内存分配的操作,是汇编阶段的概念;而声明则只是告诉包含该声明的模块在连接阶段从其它模块寻找外部函数和变量。
一般情况下头文件中只放变量的声明,因为头文件要被其他文件包含(即#include),如果把定义放到头文件的话,就不能避免多次定义变量,C++不允许多次定义变量,一个程序中对指定变量的定义只有一次,声明可以无数次。
不过有三个例外,一下三中实体的定义也可放到头文件中。
1.值在编译时就已知的const 变量的定义可以放到头文件中 如:const int num(10);
2.类的定义可以放到头文件中
3.inline 函数 例如static inline LED_ON(void) { }
这三个实体可以定义在多个源文件中,只要在每个源文件中的定义相同。
示例程序:
- 对c语言内存的思考
- C语言——内存的思考
- 对C/C++内存分配的思考与总结
- 对两个奇葩的C语言程序的思考
- 关于c语言内存地址对齐的一点思考
- C语言的思考
- C--有关内存的思考
- 使用引用计数扩展c语言实现内存自动管理的思考 -- 为什么存在内存泄露
- 对C和C++语言内存的理解
- C语言中 对变量内存关系的探讨
- 对C语言内存对齐的初步了解
- C语言如何操作内存和对NULL的解释
- 谈对C语言中内存分配的理解
- 对Linux内存管理的思考
- 对学习语言的一些思考
- 对易语言的一点思考。
- 深入理解C语言(内存对其)
- c语言中的内存对其方式
- 常用JS方法(公共方法)汇总
- 集合类自定义排序和springMVC viewResolver的顺序问题
- React Native iOS打包配置和打包
- mysql锁表解锁
- JAVA使用Jedis操作Redis
- 对c语言内存的思考
- 简单的使用xBanner
- Java学习10:内部类
- 在ubantu14.04和win7双系统下忘记ubantu系统password的解决办法
- 宏观 量子计算一句话
- ES6书写规范
- matplotlib.pyplot基础(一)
- yum 本地源配置
- 第八周项目1