C语言中的声明与定义的区别

1、对于下面的声明语句

int a;

如果其位置出现在所有的函数体之外,那么它就被称为外部对象a的定义。这个语句说明了a是一个外部整型变量,同时为a分配了存储空间。因为外部对象a并没有被明确指定任何初始值,所以它的初始值默认为0(某些系统中的连接器对以其他语言编写的程序并不保证这一点,C编译器有责任以适当方式通知连接器,确保未指定初始值的外部变量初始化为0)。

2、又如下面的声明语句:

int a = 7;

在定义a的同时也为a明确指定了初始值。这个语句不仅为a分配内存,而且也说明了在该内存中应该存储的值。

3、下面的声明语句:

extern int a;

它并不是对a的定义。这个语句仍然说明了a是一个外部整型变量,但是因为它包括了extern关键字,这就显式说明了a的存储空间是在程序的其他地方分配的,从连接器的角度来看,上述声明是一个对外部变量a的引用,而不是对a的定义。因为这种形式的声明是对一个外部对象的显式引用,即使它出现在一个函数的内部,也仍然具有同样的含义。例如下面的函数srand在外部变量random_seed中保存了其整型参数n的一份拷贝:

void srand( int n )
{
    extern int random_seed;
    random_seed = n;
}

每个外部对象都必须在程序某个地方进行定义。因此,如果一个程序中包括了语句

extern int a;

那么,这个程序就必须在别的某个地方包括语句

int a;

这两个语句既可以是在同一个源文件中,也可以位于程序的不同源文件中。

4、如果一个程序对一个外部变量的定义不止一次,又将如何处理?即对于下面的情形:

int a;

这个语句出现在两个或更多的不同源文件中,情况会是怎样的?或者说,如果语句

int a = 7;

出现在一个源文件中,而语句

int a = 9;

出现在另一个源文件中,将出现什么样的情形?这个问题的答案一般跟系统有关。不同的系统可能有不同的处理方式。严格的规则是:每个外部变量只能够定义一次。如果外部变量的多个定义各指定一个初始值,例如:

int a = 7;

出现在一个源文件中,而

int a = 9;

出现在另一个源文件中,大多数系统都会拒绝接受该程序。但是,如果一个外部变量在多个源文件张定义却没有指定初始值,那么某些系统会接受这个程序,而另外一些系统则不会接受。但是为了避免这种问题的发生,最好的方法是每个外部变量只定义一次。

C语言中的声明与定义的区别

时间: 2024-10-16 21:49:19

C语言中的声明与定义的区别的相关文章

C语言中标识符声明的几个关键字总结

C语言中声明一个名称就是把一个标识符与某个C语言对象相关联,如变量.函数或类型,C语言中可以声明的名称包括:变量.函数.类型.类型标志.结构成员与联合成员.枚举常量.语句标号和预处理器宏.除了语句标号和预处理器宏之外,所有标识符都在C语言声明中声明,变量.函数.类型放在声明的声明符中,类型标志.结构成员与联合成员和枚举常量在声明的某种类型说明符中声明,语句标号在C语言函数中出现时声明,而预处理器宏用#define预处理器命令声明. 如下列声明: extern const volatile uns

函数的声明和定义的区别

函数声明和定义的区别(1) C语言编译系统是由上往下编译的.一般被调函数放在主调函数后面的话,前面就该有声明.不然C由上往下的编译系统将无法识别.正如变量必须先声明后使用一样,函数也必须在被调用之前先声明,否则无法调用!函数的声明可以与定义分离,要注意的是一个函数只能被定义一次,但可以声明多次. 函数声明由函数返回类型.函数名和形参列表组成.形参列表必须包括形参类型,但是不必对形参命名.这三个元素被称为函数原型,函数原型描述了函数的接口.定义函数的程序员提供函数原型,使用函数的程序员就只需要对函

C++ 变量的声明与定义的区别

变量声明和定义的区别 我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益) 变量的声明有两种情况: 1.一种是需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间. 2.另一种是不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中定义的. 前者是“定义性声明(defining declaration)”或者称为“定义

第2章 变量和基本类型 附2 --声明和定义的区别

变量声明和定义的区别 我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益) 变量的声明有两种情况: 1.一种是需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间.----定义 2.另一种是不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中定义的.-----声明 前者是“定义性声明(defining declara

浅谈声明与定义的区别

以下代码使用平台是VS2012. 清楚明白声明与定义是一名合格的程序猿的基本要求. 本人认为,C++编码过程中谈及"声明"和"定义"是因为我们要使用一个变量.类型(类.结构体.枚举.共用体)或者函数,因此有申明和定义变量.类型和函数之说.C/C++中,使用一个变量.类型或者函数必须先在使用前申明它. 请记住: (1)"声明"与"定义"的本质区别是:声明可以出现多次,而定义只能出现一次. (2)把申明的东西放在头文件,把定义的东

声明与定义的区别

声明与定义的区别 声明是向编译器介绍名字--标识符.它告诉编译器"这个函数或变量在某处可找到,它的模样象什么".而定义是说:"在这里建立变量"或"在这里建立函数".它为名字分配存储空间.无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间.对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据,对于函数,编译器会生成代码,这些代码最终也要占用一定的内存. 在C和C++中,可以在不同的地方声明相同的变量和函数,但只能有一个定义(

Django与SQL语言中——NULL与空字符串的区别

SQL有指定空值的独特方式,它把空值叫做NULL. Null在数据库中表示 不知道的数据,主要有3种意思: 1)知道数据存在,但不知道具体值. 2)不知道数据是否存在. 3)数据不存在. 在SQL中, NULL的值不同于空字符串,就像Python中None不同于空字符串("")一样.这意味着某个字符型字段(如VARCHAR)的值不可能同时包含NULL和空字符串. 这会引起不必要的歧义或疑惑. 为什么这条记录有个NULL,而那条记录却有个空字符串? 它们之间有区别,还是数据输入不一致?

c语言----结构体--声明及定义

试着写点东西,主要为了巩固学习过的东西. 结构体?C语言中的结构体主要用来表达.定义一些自己想要的类型,例如日期,身份信息等等. 日期:2017-09-10 身份信息:姓名fakke,年龄23,身高180: 可以通过struct来实现.(个人感觉有点像python的字典) 定义的方式: 第一步:声明结构类型: struct   类型名字{ 变量类型1   变量名: 变量类型2  变量名: ... 变量类型3  变量名: }: 第二步:  2定义新的变量 struct date 变量名; 第三步:

【非原】c语言之声明和定义的区别

原创地址:http://www.cnblogs.com/haore147/p/3647466.html 什么是定义?什么是声明?它们有何区别? 举个例子: 1 2 A)int i; B)extern int i;(关于extern,后面解释) 哪个是定义?哪个是声明?或者都是定义或者都是声明?我所教过的学生几乎没有一人能回答上这个问题.这个十分重要的概念在大学里从来没有被提起过! 什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说