最近在看多文件编程的时候遇到的一个问题,本来以为理解了声明和定义的区别(然而并没有····),也算是重新认识了一次声明和定义,下面上代码

声明和定义:有分配空间的叫定义,没分配空间的叫声明

定义:表示创建变量或分配存储单元

声明:说明变量的性质,但并不分配存储单元

情形一:在源文件(.c)中(函数内)

int a;//定义

extern int a;//声明

第一个int a是定义,分配了存储空间(其实包括了声明和定义两个步骤,可以叫"定义性声明"),第二个 extern int a是声明(也叫"引用性声明"),没有分配存储空间

关于extern的使用,感兴趣的读者可以看一下另一片随笔:

声明可以多次,定义只能有一次

意思是在源文件(.c)中可以多次声明同一个变量,例如

在编译阶段是不会报错的

情形二:在源文件(.c)中(函数外)

编译结果:

这里的int a;放在函数外,没有出现重定义的错误,并不意味着int a就不是定义了,int a仍然是定义,编译阶段没有报错了原因在于全局变量没有赋初值,没赋初值的全局变量,那么在目标文件中是不会为

这个全局变量分配空间的,它被放在BSS段(如果是赋初值的全局变量,那么放在data段),BSS段在目标文件中是没有的(这个就是编译阶段不会报错的原因),意味着没赋初值的全局变量不占磁盘空间,

当程序加载运行时,就会为bss段中的数据分配内存进行初始化了(起到了节省磁盘空间的作用),上面说了BSS段的数据不占磁盘空间,那么它的大小和符号存在哪呢? bss段占据的大小存放在ELF文件格式

中的段表(Section Table)中,段表存放了各个段的各种信息,比如段的名字、段的类型、段在elf文件中的偏移、段的大小等信息

(感谢园友:SD8086 指出随笔中的错误)

(对内存映像感兴趣的读者可以看下这两篇文章:

情形三:在头文件(.h)中

在头文件中的声明和定义和在源文件中函数外的声明和定义相同,下面为测试结果

修改头文件后

从上面可以看出int a在头文件中仍然是定义,只不过和全局变量定义相同,只要没有赋初值,编译阶段就不会报错

[转载]C++中声明与定义的区别

C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类的实现放在cpp文件中.它们为什么能够关联到一起呢?你知道什么东西可以放在.h文件中,什么不能.什么东西又可以放在cpp文件中.如果 ...

C++中声明与定义的区别

如果是指变量的声明和定义: 从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存.而 定义就是分配了内存.对于下面的两句代码:void Func(){in ...

C++中声明和定义的区别

声明 这有一个与这个名字相关的东西,并且它是这个类型的,告诉编译器我要使用它,并期待它定义在某一个地方. 定义 定义是指提供所有必要的信息(占用内存大小),使其能够创建整个实体. 我们必须明白的: 一 ...

C\C++中声明与定义的区别

声明和定义是完全同的概念,声明是告诉编译器"这个函数或者变量可以在哪找到,它的模样像什么".而定义则是告诉编译器,"在这里建立变量或函数",并且为它们分配内存空 ...

C语言中声明和定义详解(待看。。

变量声明和变量定义 变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. 变量声明:用于向程序表明变量的类型和名字. 定义也是声明,extern声明不是定义 定义也是 ...

C++中的头文件(.h)和源文件(.cpp)都应该写什么?

头文件(.h):写定义和声明写类的声明(包括类里面的成员和方法的声明).函数原型.#define常数等,但是一般来说不写具体的实现.注意: 1.在写头文件的时候需要注意,在开头和结尾处必须按照如下样式 ...

[C] 如何使用头文件 .h 编译 C 源码

在 C 语言中,头文件或包含文件通常是一个源代码文件,程序员使用编译器指令将头文件包含进其他源文件的开始(或头部),由编译器在处理另一个源文件时自动包含进来. 一个头文件一般包含类.子程序.变量和其他 ...

[转]extern与头文件(*.h)的区别和联系

用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字? 如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include (xxx. ...

extern与头文件(*.h)的区别和联系

原文网址为:http://lpy999.blog.163.com/blog/static/117372061201182051413310/ 个人认为有一些道理:所以转过来学习了. 用#include ...

随机推荐

Linux下通配符总结

* - 通配符,代表任意字符(0到多个)? - 通配符,代表一个字符# - 注释/ - 跳转符号,将特殊字符或通配符还原成一般符号| - 分隔两个管线命令的界定; - 连续性命令的界定~ - 用户的根 ...

别再抱怨了,国内这么多优秀的Android资源你都知道吗?

因为一些大家都知道的原因,android很多官方出品的优秀开发资源在国内无法访问. 国内的同行们对此也做出了很多努力,有很多朋友通过各种手段把很多优秀的资源搬运到了国内,为国内android开发者提供 ...

Linux服务器之间的目录共享

1.在Redhat Linux中查看是否已安装NFS及portmap的命令如下:rpm -qa |grep portmaprpm -qa |grep nfs2.如果没有安装这两个软件包,安装命令如下: ...

由于无法创建应用程序域,因此未能执行请求。错误: 0x80070002 系统找不到指定的文件

前两天安装了一堆补丁后突然发现,原本正常使用了一年的应用系统打不开了,到事件日志中发现有.net framewok 2.0的补丁安装失败的日志,于从从重装补丁开始.到重新注册.net框架,再到所有.n ...

codeforces A. Cinema Line 解题报告

题目链接:http://codeforces.com/problemset/problem/349/A 题目意思:题目不难理解,从一开始什么钱都没有的情况下,要向每一个人售票,每张票价格是25卢布,这 ...

错误记录:html隐藏域的值存字符串时出错

问题 webform在后台给前台传值.

css中的边框样式

在盒子模型中,盒子的边框是其重要的样式,通过边框我们可以很方便地看出盒子的长宽以及大小.边框的特性可以通过边框线,边框的宽度及颜色来呈现. 1,边框线 边框线指的是边框线条的样式,包括实线,虚线,点划 ...

S3C2440时钟系统详解

在讲述系统时钟之前,因为这些设备都是挂靠在系统时钟上的,所以必须先说系统时钟,S3C2440的时钟系统如下 外部时钟源分两种,晶振或者外部频率,由om3-2选择,时钟电路根据两种选择也有两种 我们来分 ...

springmvc4开发rest

Spring MVC 4 RESTFul Web Services CRUD Example+RestTemplate Created on:  August 11, 2015  | Last upd ...

mvc根据绝对路径下载文件

首先页面需要一个a标签直接指向下载文件的Action并传值:图片地址,以及图片名称(记住要带后缀名的). 然后是Action里面的代码. SiteHelper.DownloadFile(fileUrl ...

c语言中引用头使用什么指令,在源文件(.c)和头文件(.h)中声明和定义的区别——C语言...相关推荐

  1. python现有两个磁盘文件a和b_有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中Python实例...

    有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列), 输出到一个新文件C中Python实例 题目:有两个磁盘文件A和B,各存放一行字母,要求把这两个文件中的信息合并( ...

  2. c语言中声明外部函数需要添加的关键字,C语言中声明和定义的区别——分析extern关键词。...

    一直很迷惑C语言中的声明和定义的有些实践中的用法,说迷惑实践是因为声明和定义的概念上的区别是很明确的. 定义和声明的区别(主要针对变量): 定义是要为变量分配存储空间,还可以在定义的时候为变量指定初始 ...

  3. c语言变量定义位置区别,C语言中变量定义的位置(C89和C99的区别)

    C语言中变量定义的位置(C89和C99的区别) 在C++和JAVA中,按照语法,我们可以把变量定义在任何位置,所以很多人习惯了"哪里使用哪里定义"的这种做法,所以当用C语言进行编程 ...

  4. C++ const关键字的总结(全局/局部变量、修饰指针和引用、成员函数和数据成员、修饰类对象、const与宏定义的区别、Static与Const的区别)

    const关键字 const关键字 1.什么是const 2.使用原理 2.1.const全局/局部变量 2.2.cosnt修饰指针和引用 2.3.const修饰函数参数 2.4.const修饰函数返 ...

  5. c++中声明和定义的区别(这个兄弟写的解决了我的疑惑)

    前言:网上有些关于C/C++中函数和定义之间的没有描述的很清晰,这里总结一番: 声明和定义在作用于变量和函数中是有区别的:这也是网上一些说话有分歧的地方: 1.声明和定义变量时:         要区 ...

  6. C语言 变量声明和定义的区别

    变量的声明有两种情况: 1.一种是需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间. 2.另一种是不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中 ...

  7. C\C++中声明与定义的区别

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  8. 服务器上的此文件夹中具有更多项目,清理或删除“可恢复的项目”文件夹中的项目...

    清理或删除"可恢复的项目"文件夹中的项目 2021/6/1 本文内容 "可恢复的项目"文件夹 (在 Exchange 早期版本中称为垃圾站 ) , 用于防止意外 ...

  9. C语言中声明和定义的区别

    2019独角兽企业重金招聘Python工程师标准>>> 声明(declaration )指定了一个变量的标识符,用来描述变量的类型,是类型还是对象,或者函数等.声明,用于编译器(co ...

最新文章

  1. gridview列 数字、货币和日期 显示格式
  2. LOJ#510. 「LibreOJ NOI Round #1」北校门外的回忆(线段树)
  3. ASP.NET知识点:母版页的路径问题
  4. android中的AIDL进程间通信
  5. Eclipse安装hibernate插件的问题
  6. figma下载_Figma中的动态内容和颜色
  7. Android 基础—— 对Context的理解与使用技巧
  8. 首次将项目从eclipse提交到服务器的SVN
  9. 部署Hadoop2.0高性能集群
  10. 求矩形和圆柱的体积(用到了接口)
  11. React hook必须要知道的知识: useEffect的cleanup
  12. 成为一个好的PHP工程师需要掌握什么技能
  13. Icarus Verilog
  14. 关于Mybatis的深入学习(4)之动态SQL二十四道练习
  15. ps 给渐变的背景色换一个颜色
  16. 三极管为什么可以放大电流?
  17. 21天 mysql_java基础第21天_mysql
  18. vs2008编译QT开源项目--太阳神三国杀源码分析(二) 客户端添加武将
  19. 谷歌大数据的三驾马车
  20. 从稻农成长为技术领导者

热门文章

  1. 软件设计师考试-程序设计语言与语言处理程序基础
  2. 一粒云Server 安装指南
  3. 一次拍图完成手机双摄标定的方法
  4. JVM类加载器分类和解析
  5. SAP FI 财务模块 关键用户 考试练习 问卷
  6. python matplotlib 画滚动图_Python下matplotlib常见图形绘制
  7. 编译原理-语法制导翻译 课后习题+笔记
  8. 高层管理者的3个“毒瘤”,才是企业的大危机
  9. go java 垃圾回收_Go/Java垃圾回收算法对比解析
  10. Ubuntu18.04开机切换用户登录设置