变量的声明与定义以及关键字extern的用法

原创 2006年05月17日 21:34:00
变量的声明与定义:
在很多编码规则都有这样一条,变量与函数的声明放在头文件中,它们相应的定义放在源文件中。
可是很多人尤其是初学者对声明和定义分辨不清,觉得声明即是定义,定义即是声明。造成这种混淆
并不奇怪,因为变量在大多数情况下,声明的同时就定义了。
e.g.
//main1.c
int var; //声明的同时也对其定义了
int main(int argc, char **argv[])
{
 ...
}
而如下是纯粹的声明,没有包含定义
e.g.
//main2.c
extern int val; //仅仅声明这是个外部变量,extern的具体作用在后面讲。
int main(int argc, char **argv[])
{
 ...
}
而函数的声明与定义也是类似的。而且要更容易区分。
e.g.
//main3.c
void func() //即是声明也是定义
{
 ...
}
int main(int argc, char **argv[])
{
 ...
 func(); //可以编译链接
 ...
}
仅仅对函数声明的话,就不需要写函数体,只要声明函数类型以及函数形参的信息就可以了。
e.g.
//main4.c
void func(char); //仅仅是声明
int main(int argc, char **argv[])
{
 ...
 func(); //编译可以顺利通过,如果后面没有函数定义的话链接将会失败
 ...
}
void func(char *str) //函数定义,如果此文件中没有这部分定义的话,main中可以编译,但不能链接
{
 ...
}
之所以函数的定义与声明比较好区分是因为函数必须得有函数体编译器才能给它分配空间,而变量仅仅需要要个名字和它的类型编译器就
可以分配空间给它。
所以可以这样说,声明只是告诉编译器声明的变量和函数是存在的,但并没有真正分配空间给它,所以当后面的代码
用到前面声明的变量或函数时,编译器在编译的时候不会报错,但是在链接的时候会报错,因为链接的时候编译器会去
寻找这些变量和函数的内存地址,因为只声明了但没定义,链接器当然找不到它们了,所以就报错了。而对它们进行定义
了的话编译器就会给它们分配空间,它们就有自己的地址了,这时就能链接了。
所以定义是要分配空间的,所以定义只能有一次。而声明不分配空间,你可以声明多次。
extern关键字
我今天写这边短文就是因为有人问我extern的用法,他们知道怎么样extern,但是对extern原理不清楚,知其然不知其所以然。
上面main2.c中的extern int val; 它的作用就是告诉编译器这个变量是在其他文件中定义的(是外援),要是在本文件中
看到它的名字千万别奇怪。编译器是相信自己人的,所以在编译的时候要是看到val变量时会认为它是存在,不会报错。只有在
链接的时候链接器才会去其它obj文件中寻找val变量的定义(地址),找到则顺利链接,否则报错。因为编译器只需要知道extern所
声明变量的名字就可以了,所以extern int val 可以写成 extern val(即省略变量类型)。
e.g.
//main2.c
extern int val; //声明val是个外部变量,也可以写成extern val;
int main(int argc, char **argv[])
{
 val = 10;
 ...
}
//another.c
int val;
把这两个文件一起编译链接是没有问题的。
并不是所有的变量都能用extern声明,只有全局变量并且没有被static 声明的变量才能声明为extern.
所以如果你不想自己源文件中全局的变量被其他文件引用,你就可以给变量加上static声明
e.g.
extern val; //链接的时候会报错,因为val被声明为static.
int main(int argc, char **argv[])
{
 val = 10;
 ...
}
//another.c
static int val;
这也是static全局变量和非static全局变量的唯一的一个区别。

C语言中声明和定义的区别——分析extern关键词。

一直很迷惑C语言中的声明和定义的有些实践中的用法,说迷惑实践是因为声明和定义的概念上的区别是很明确的。 定义和声明的区别(主要针对变量): 定义是要为变量分配存储空间,还可以在定义的时候为变量指定...
  • littledouble
  • littledouble
  • 2015年06月03日 08:28
  • 1645

头文件中只能声明变量不能定义变量 而声明变量必须带extern,为什么头文件中变量的声明都没有加

 1.头文件中不可以放变量的定义!一般头文件中只是放变量的声明,因为头文件要被其他文件包含#include,如果把定义放在头文件的话,就不能避免多次定义变量。C++不允许多次定义变量,一个程序中...
  • hudfang
  • hudfang
  • 2014年12月18日 10:55
  • 4292

结构体的声明(extern)与调用的方式

结构体的声明(extern)与调用的方式   转载▼ 这几天写液晶字库索引时发现一个问题,本来想在.h文件中这样定义:   // ----------------...
  • chrovery
  • chrovery
  • 2014年09月03日 11:52
  • 3140

变量的声明与定义以及关键字extern的用法

变量的声明与定义: A of a variable allocatesstorage for the variable and may also specify an initial value f...
  • lixiaoguang20
  • lixiaoguang20
  • 2017年03月09日 17:31
  • 121

定义和声明的分离:extern关键字

在谈到extern关键字之前,首先要清楚地认识两个名词:变量的定义和声明。 变量的定义:用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。 变量的声明:用...
  • zs634134578
  • zs634134578
  • 2013年05月08日 21:35
  • 625

关键字 extern static const, 声明和定义的区别

原帖 http://hi.baidu.com/bwandmff/blog/item/56876b30a31d519da9018e9a.htm在讨论全局变量之前我们先要明白几个基本的概念:1. 编译单元...
  • dos5gw
  • dos5gw
  • 2011年03月01日 16:59
  • 987

变量的声明与定义“extern”

如果你的变量在一个文件A中,而你想在另一个文件B中使用它,就需要在使用前在B中声明这个变量,这时候需要用到extern关键字。 extern用在变量声明中常常有这样一个作用,你在*.c文件中定义了一个...
  • wangluomin
  • wangluomin
  • 2013年09月01日 15:06
  • 439

变量的声明、定义、extern、static总结

1. 变量的声明和定义 变量定义: 所谓定义就是编译器创建一个对象,并且为变量分配一块存储空间,并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名。在程序中对象有且仅有一个定义。例如int...
  • h792746371
  • h792746371
  • 2017年07月13日 22:06
  • 129

【编程语言】变量的定义以及与extern声明的区别

变量的定义与声明的区别         首先,变量的定义一定是发生在变量声明(extern)之前,变量的声明可以有多个,但是变量的定义只有一种,变量的声明影响变量的引用和作用域,而变量的定义则只是...
  • CJ_Kano
  • CJ_Kano
  • 2015年01月02日 19:22
  • 692

变量的声明和定义的关系、extern关键字的使用

变量声明规定了变量的名字和类型,定义还申请存储空间,也可能会为变量赋一初值。 注意: 变量可以声明很多次,但定义只能定义一次,否则编译器将会报错。 在编写复杂程序时,会有许多文件,需要有...
  • xiaoyuxianshenging
  • xiaoyuxianshenging
  • 2017年02月10日 10:28
  • 695
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:变量的声明与定义以及关键字extern的用法
举报原因:
原因补充:

(最多只允许输入30个字)