对c语言内存的思考

来源:互联网 发布:去公司做淘宝推广员 编辑:程序博客网 时间:2024/06/05 00:18

一、C语言中变量声明与定义的区别

  1. 变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。
  2. 变量声明:(1)、 告诉编译器,这个名字已经匹配到一块内存上了,下面的代码用到变量或对象是在别的地方定义的。声明可以出现多次
    (2)、 告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量名或对象名 。例如函数参数的声明 extern int func (int a, int b);

如何清晰的区分变量声明和定义

extern通知编译器变量在其他地方被定义

  1. 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; //定义     

程序模块化设计风格

概要

  1. 不要把变量定义放入.h文件,这样容易导致重复定义错误

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

  1. 尽量使用static关键字把变量定义限制于该源文件作用域,除非变量被设计成全局的。

  2. 可以在头文件中声明一个变量,在用的时候包含这个头文件就声明了这个变量

模块化要点

(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) { }

这三个实体可以定义在多个源文件中,只要在每个源文件中的定义相同。

示例程序:


原创粉丝点击