当前位置: 首页 > news >正文

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

变量声明和定义的区别

我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益)

 

变量的声明有两种情况:

1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。----定义

2、另一种是不需要建立存储空间的。 例如:extern int a 其中变量a是在别的文件中定义的。-----声明

前者是“定义性声明(defining declaration)”或者称为“定义(definition)”,而后者是“引用性声明(referncing declaration)”,从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义,例如:int a 它既是声明,同时又是定义。然而对于 extern a 来讲它只是声明不是定义。一般的情况下我们常常这样叙述,把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。很明显我们在这里指的声明是范围比较窄的,即狭义上的声明,也就是说非定义性质的声明,例如:在主函数中:

 1 int main()
 2 
 3  {
 4         extern int A;
 5             //这是个声明而不是定义,声明A是一个已经定义了的外部变量
 6             //注意:声明外部变量时可以把变量类型去掉如:extern A;
 7         dosth(); //执行函数
 8 }
 9 
10     int A; //是定义,定义了A为整型的外部变量                    

 

外部变量的“定义”与外部变量的“声明”是不相同的,外部变量的定义只能有一次,它的位置是在所有函数之外,而同一个文件中的外部变量声明可以是多次的,它可以在函数之内(哪个函数要用就在那个函数中声明)也可以在函数之外(在外部变量的定义点之前)。系统会根据外部变量的定义(而不是根据外部变量的声明)分配存储空间的。对于外部变量来讲,初始化只能是在“定义”中进行,而不是在“声明”中。所谓的“声明”,其作用,是声明该变量是一个已在后面定义过的外部变量,仅仅是为了“提前”引用该变量而作的“声明”而已。extern 只作声明,不作任何定义。

(我们声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用就没有单独声明的必要,变量是如此,函数也是如此,所以声明不会分配存储空间,只有定义时才会分配存储空间。)

用static来声明一个变量的作用有二:

(1)对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在。

(2)外部变量用static来声明,则该变量的作用只限于本文件模块。

 

 

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

 

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

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

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

如:const int num(10);

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

3.inline 函数

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

 

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

转载于:https://www.cnblogs.com/584709796-qq-com/p/4862298.html

相关文章:

  • MySQL,binlog2sql回滚操作测试
  • 2015年9月30日的作业
  • 201771010126 王燕《面向对象程序设计(Java)》第九周学习总结
  • icomoon用法
  • [BZOJ] 2044: 三维导弹拦截
  • this class is not key value coding-compliant for the key XXX错误的解决方法
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • LeetCode——Implement Trie (Prefix Tree)
  • 从普通程序员到身价过百亿:追求长期价值的耐心,决定了你能走多远
  • Android图形显示系统——概述
  • WPF中查看PDF文件
  • Jenkins——持续集成服务器
  • JVM里面hashtable和hashmap实现原理
  • iOS 10 的推送 User Notifications Framework
  • .NET连接MongoDB数据库实例教程
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Asm.js的简单介绍
  • C# 免费离线人脸识别 2.0 Demo
  • CAP理论的例子讲解
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • JS专题之继承
  • Octave 入门
  • React 快速上手 - 07 前端路由 react-router
  • Redux系列x:源码分析
  • 阿里云应用高可用服务公测发布
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 写代码的正确姿势
  • 一个项目push到多个远程Git仓库
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • scrapy中间件源码分析及常用中间件大全
  • Spring Batch JSON 支持
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​如何在iOS手机上查看应用日志
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (20050108)又读《平凡的世界》
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (java)关于Thread的挂起和恢复
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (转载)CentOS查看系统信息|CentOS查看命令
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .net wcf memory gates checking failed
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • [ C++ ] STL---仿函数与priority_queue
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [ACM] hdu 1201 18岁生日
  • [Android] Amazon 的 android 音视频开发文档
  • [Android]创建TabBar