C语言中变量的声明和定义的关系
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言中变量的声明和定义的关系
在英文里有两个词涉及这个问题:declare 和 define,在中文中这两个词都可以翻成“定义”,但在C语言中他们有不同的意义;让我们称declare=声明,define=定义。
“声明(declare)”是用于定义一个变量的类型;“定义(define)”是用于定义一个变量所占用的存储;显然,一个变量的类型可以定义多次,只要他们不互相矛盾即可;而一个变量的存储只能定义一次,否则程序如何用一个变量名访问多于一个的存储空间呢?
每次引用一个变量时,引用变量的语句行之前必须出现该变量的声明,该声明可以是直接出现在这个语句行所在的源文件中,或出现在一个头文件中,该源文件用include包含这个头文件。
一个项目中可以有多个源文件,但在所有的源文件中只允许出现一次对某个变量的定义。
这里借用“新手园地”中小罗纳耳朵的一个问题作为例子:
我用Keil写程序时,子程序里需要用到定义一个数组 array[]={0x01,0x02}
放在main函数里定义会提示array未定义!
但是如果放在头文件config.h里面定义为:
extern code unsigned CHAR array[]={0x01,0x02};
结果编译时出现 MULTIPLE PUBLIC DEFINITIONS定义。但是我的头文件里面已经用预处理
命令了
#ifndef __CONFIG_H__
#define __CONFIG_H__
头文件的内容
#endif
为什么还会出现这种重复定义的错误?
他的错误是,下面这行是定义array的存储,而他又把这行放到了头文件config.h中,等于是在多个源文件中重复地定义array的存储:
extern code unsigned CHAR array[]={0x01,0x02};
正确的做法是在头文件中用这样的声明语句(必须加extern,否则变成定义存储了):extern code unsigned CHAR array[]; // 声明array是一个外部变量
然后在某个源文件中加入这样的语句(此处不必加extern):
code unsigned CHAR array[] = {0x01, 0x02}; // 定义array的存储