声明和定义

C++Primer》第四版 2.3.5节中这么说到:

①变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。

②变量声明:用于向程序表明变量的类型和名字。

③定义也是声明:当定义变量时我们声明了它的类型和名字。

④extern关键字:通过使用extern关键字声明变量名而不定义它。

1.定义也是声明,extern声明不是定义,即不分配存储空间。extern告诉编译器变量在其他地方定义了。

例如:extern int i; //声明,不是定义

int i; //声明,也是定义

2.如果声明有初始化式,就被当作定义,即使前面加了extern。只有当extern声明位于函数外部时,才可以被初始化。

例如:extern double pi=3.1416;  //定义

3.函数的声明和定义区别比较简单,带有{ }的就是定义,否则就是声明。

例如:extern double max(double d1,double d2);  //声明

4.除非有extern关键字,否则都是变量的定义。

例如:extern int i; //声明

int i; //定义

程序设计风格:

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

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

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

总结:

变量在使用前就要被定义或者声明。

在一个程序中,变量只能定义一次,却可以声明多次。

定义分配存储空间,而声明不会。

C++程序通常由许多文件组成,为了让多个文件访问相同的变量,C++区分了声明和定义。

变量的定义(definition)用于为变量分配存储空间,还可以为变量指定初始值。在程序中,变量有且仅有一个定义。

声明(declaration)用于向程序表明变量的类型和名字。定义也是声明:当定义变量的时候我们声明了它的类型和名字。可以通过使用extern声明变量名而不定义它。不定义变量的声明包括对象名、对象类型和对象类型前的关键字extern。

extern声明不是定义,也不分配存储空间。事实上它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。

只有当声明也是定义时,声明才可以有初始化式,因为只有定义才分配存储空间。初始化式必须要有存储空间来进行初始化。如果声明有初始化式,那么它可被当作是定义,即使声明标记为extern。

任何在多文件中使用的变量都需要有与定义分离的声明。在这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义)。

--------------------------------------------------------------------头文件中定义与声明

注意头文件中不可以放变量的定义!!!一般情况下头文件中只放变量的声明,因为头文件要被其他文件包含(即#include),如果把定义放到头文件的话,就不能避免多次定义变量,C++不允许多次定义变量,一个程序中对指定变量的定义只有一次,声明可以无数次。

不过有三个例外,一下三中实体的定义也可放到头文件中。

1.值在编译时就已知的const 变量的定义可以放到头文件中

如:const int num(10);

2.类的定义可以放到头文件中

3.inline 函数

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

/--------------------------------------------------------------------头文件中定义与声明

时间: 2024-10-24 17:07:07

声明和定义的相关文章

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

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

C语言,函数的声明与定义

函数声明与定义 变量: 在讲变量前,先讲一下变量的声明和定义这两个概念. 声明一个变量,意味着向编译器描述变量的类型,但不为变量分配存储空间. 定义一个变量,意味着在声明变量的同时还要为变量分配存储空间,在定义变量的同时为变量初始化. 局部变量:通常只定义不声明. 全局变量:通常在源文件中定义,在头文件中声明. 在一个函数内部定义的变量成为局部变量,它在本函数内有效. 函数中的局部变量,如果不定义类型,其缺省是自动变量auto, 例如:int a,b=2; 其等价于auto int a,b =

变量声明和定义的区别

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

【C】 05 - 声明和定义

仅从形式上看,C程序就是由各种声明和定义组成的.它们是程序的骨架和外表,不仅定义了数据(变量),还定义了行为(函数).规范中的纯语言部分,声明和定义亦花去了最多的篇幅.完全说清定义的语法比较困难,这里也只是个人的理解. 1. 标识属性 对C编译器而言,标识(identifier)包括对象名.函数名.复合类型及枚举tag.typedef类型名.label和枚举常量.标识的各种属性构成了C的复杂功能,理清这些概念对C的高级使用尤其重要. 域(scope)可以看做是标识的活动范围,一个编译单元中该范围

【零基础学习iOS开发】【02-C语言】11-函数的声明和定义

在上一讲中,简单介绍了函数的定义和使用,只要你想完成一个新功能,首先想到的应该是定义一个新的函数来完成这个功能.这讲继续介绍函数的其他用法和注意事项. 一.函数的声明 1.在C语言中,函数的定义顺序是有讲究的:默认情况下,只有后面定义的函数才可以调用前面定义过的函数 1 int sum(int a, int b) { 2 return a + b; 3 } 4 5 int main() 6 { 7 int c = sum(1, 4); 8 return 0; 9 } 第5行定义的main函数调用

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

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

【C++注意事项】2 变量声明和定义

不可能将所有的C++程序放到一个文件中咯,因此C++就支持了分离式编译(separate compilation)机制,它允许将程序分为若干个文件,每个文件可被独立编译.这样说明了,当你的程序有很多文件时,修改其中一个文件后不需要将所有文件都重新编译一遍,只需要编译修改过的就好,然后将它们都链接起来. C++是如何支持分离式编译的呢?通过将声明和定义分离开来. 声明(declaration)使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含该名字的声明. 定义(definition)

声明和定义的区别

声明部分的作用是对有关的标识符(如变量?函数?结构体?共用体等)的属性进行说明.对于函数,声明和定义的区别是明显的,函数的声明是函数的原型,而函数的定义是函数功能的确立.对函数的声明是可以放在声明部分中的,而函数的定义显然不在函数的声明部分范围内,它是一个文件中的独立模块. 在声明部分出现的变量有两种情况:一种是需要建立存储空间的(如int a;):另一种是不需要建立存储空间的(如extern int a;).前者称为定义性声明(defining declaration),或简称为定义(defi

变量声明和定义的关系

extern int i;    //声明i而非定义i int j;        //声明并定义j 任何包含了显示初始化的声明即成为定义.我们能由extern关键字标记的变量赋一个初始值,但是这么做也就抵消了extern的作用.extern语句如果包含初始值就不再是声明,而变成定义了: extern double pi = 3.1416;    //定义 在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误. Note:变量能且只能被定义一次,但是可以被多次声明

C++全局变量的声明和定义

(1)编译单元(模块) 在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作: 第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件: 第二步,将工程中所有的obj文件进行LINK,生成最终.exe文件. 那么,错误可能在两个地方产生: 一个,编译时的错误,这个主要是语法错误: 一个,链接时的错误,主要是重复定义变量等. 编译单元指在编译阶段生成的每个obj文件. 一个obj文件就是一个编译单元. 一个.cpp(.c)和它相应的.h文件共同组成了一个编译单元.