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

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

相信大部分读者对声明和定义的理解是:有分配空间的叫定义,没分配空间的叫声明

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

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

int a;//定义
extern int a;//声明

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

1、告诉编译器,这个名字已经匹配到一块内存上,下面的代码用到变量或者对象是在别的地方定义的

2、告诉编译器,这个名字已经被预定了,别的地方再也不能用它来作为变量名或对象名

关于extern的使用,感兴趣的读者可以看一下另一片随笔:extern的使用详解(多文件编程)——C语言

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

意思是在源文件(.c)中可以多次声明同一个变量,例如在编译阶段是不会报错的

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

在头文件中的定义和声明的就和上面所将的不太一样了,首先来看下最大的一个区别,把一段相同的代码分别放到源文件头文件中编译

int a在源文件中的编译结果:

int a在头文件中的编译结果:

可能在这里读者就纳闷了,int a不是定义吗,为什么在头文件中两次int a编译器不报错?我们现在头文件中重现重定义的错误

编译结果:

到这里就可以看出一点眉目了,意思是同样的语句int a;在源文件中会被当作定义,而在头文件中会被当作声明,而int a = 1;无论是在源文件还是头文件中都会被当作定义(这句话的正确性有待考证,但至少在VC2010和VS2017中是成立的)

转载于:https://www.cnblogs.com/lanhaicode/p/10686688.html

在源文件(.c)和头文件(.h)中声明和定义的区别——C语言相关推荐

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

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

  2. c语言变量在头文件定义变量吗,在头文件C中声明变量

    参见英文答案 > What should go into an .h file?                                    12个 我正在尝试创建一个简单的程序,使用 ...

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

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

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

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

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

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

  6. C语音中声明与定义的区别

    https://jingyan.baidu.com/article/020278118e51e01bcd9ce576.html

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

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

  8. C语言头文件.h互相包含所引发的一系列错误C2143之类的解决方法

    本文可解决的问题: 在一个头文件.h中定义一个结构体,在另一个.h文件中使用这个结构体引发错误 C2143    语法错误: 缺少")"(在"*"的前面) (编 ...

  9. C语言中声明和定义详解

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

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

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

最新文章

  1. Java进程占用内存超高分析
  2. OpenGL超级宝典笔记——累积缓冲区与其他颜色操作
  3. socket python 收 发 队列 线程_对于Python中socket.listen()与多线程结合的困惑?
  4. 13.10 Scala中使用JSON.toJSONString报错:ambiguous reference to overloaded definition
  5. 牛客网dp专题 数位dp
  6. Simple Addition expression【打表+二分】
  7. java 共享软件 保护_【Java并发.3】对象的共享
  8. Qt creator5.7 OpenCV249之pyrUp函数(含源码下载)
  9. 爬虫-代理的爬取练习191110
  10. linux apache mod_jk,Linux上安装Apache,安装mod_jk,相关配置
  11. 6.2(求一个整数各位数字之和)
  12. ReentranLock源码分析
  13. Android 六大布局之 LinearLayout( 线性布局)
  14. Android网卡(Wifi/Lan)带宽测试
  15. ElasticJob‐Lite:扩展作业类型
  16. c语言出现源文件未编译,dev运行C语言出问题
  17. ARM开发——常见仿真器
  18. python爬去新浪微博_GitHub - dataabc/weiboSpider: 新浪微博爬虫,用python爬取新浪微博数据...
  19. 网络调试助手简单使用教程
  20. 微信发送图片php,PHP怎么实现微信图片上传到服务器?

热门文章

  1. lucas+卡特兰数
  2. ios在没有越狱的机器上安装插件
  3. weblogic使用脚本部署
  4. 网站测试自动化系统—在测试代码中硬编码测试数据
  5. 国联安 德盛 新基金 申购免手续费 产品好 利润高
  6. JDK8相对于JDK7的一些新特性
  7. SSH框架总结(框架分析+环境搭建+实例源码下载
  8. 掌握中台系统,需要了解哪些技术?
  9. 还在用Json-lib?面对疾风吧!
  10. Nginx核心原理揭秘:Nginx为什么高效?