在源文件(.c)和头文件(.h)中声明和定义的区别——C语言
最近在看多文件编程的时候遇到的一个问题,本来以为理解了声明和定义的区别(然而并没有····),也算是重新认识了一次声明和定义,下面上代码
情形一:在源文件(.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语言相关推荐
- c语言中引用头使用什么指令,在源文件(.c)和头文件(.h)中声明和定义的区别——C语言...
最近在看多文件编程的时候遇到的一个问题,本来以为理解了声明和定义的区别(然而并没有····),也算是重新认识了一次声明和定义,下面上代码 声明和定义:有分配空间的叫定义,没分配空间的叫声明 定义:表示 ...
- c语言变量在头文件定义变量吗,在头文件C中声明变量
参见英文答案 > What should go into an .h file? 12个 我正在尝试创建一个简单的程序,使用 ...
- c++中声明和定义的区别(这个兄弟写的解决了我的疑惑)
前言:网上有些关于C/C++中函数和定义之间的没有描述的很清晰,这里总结一番: 声明和定义在作用于变量和函数中是有区别的:这也是网上一些说话有分歧的地方: 1.声明和定义变量时: 要区 ...
- c语言中声明外部函数需要添加的关键字,C语言中声明和定义的区别——分析extern关键词。...
一直很迷惑C语言中的声明和定义的有些实践中的用法,说迷惑实践是因为声明和定义的概念上的区别是很明确的. 定义和声明的区别(主要针对变量): 定义是要为变量分配存储空间,还可以在定义的时候为变量指定初始 ...
- C\C++中声明与定义的区别
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- C语音中声明与定义的区别
https://jingyan.baidu.com/article/020278118e51e01bcd9ce576.html
- C语言中声明和定义的区别
2019独角兽企业重金招聘Python工程师标准>>> 声明(declaration )指定了一个变量的标识符,用来描述变量的类型,是类型还是对象,或者函数等.声明,用于编译器(co ...
- C语言头文件.h互相包含所引发的一系列错误C2143之类的解决方法
本文可解决的问题: 在一个头文件.h中定义一个结构体,在另一个.h文件中使用这个结构体引发错误 C2143 语法错误: 缺少")"(在"*"的前面) (编 ...
- C语言中声明和定义详解
变量声明和变量定义 变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. 变量声明:用于向程序表明变量的类型和名字. 定义也是声明,extern声明不是定义 定义也是 ...
- extern与头文件(*.h)的区别和联系
原文网址为:http://lpy999.blog.163.com/blog/static/117372061201182051413310/ 个人认为有一些道理:所以转过来学习了. 用#include ...
最新文章
- Java进程占用内存超高分析
- OpenGL超级宝典笔记——累积缓冲区与其他颜色操作
- socket python 收 发 队列 线程_对于Python中socket.listen()与多线程结合的困惑?
- 13.10 Scala中使用JSON.toJSONString报错:ambiguous reference to overloaded definition
- 牛客网dp专题 数位dp
- Simple Addition expression【打表+二分】
- java 共享软件 保护_【Java并发.3】对象的共享
- Qt creator5.7 OpenCV249之pyrUp函数(含源码下载)
- 爬虫-代理的爬取练习191110
- linux apache mod_jk,Linux上安装Apache,安装mod_jk,相关配置
- 6.2(求一个整数各位数字之和)
- ReentranLock源码分析
- Android 六大布局之 LinearLayout( 线性布局)
- Android网卡(Wifi/Lan)带宽测试
- ElasticJob‐Lite:扩展作业类型
- c语言出现源文件未编译,dev运行C语言出问题
- ARM开发——常见仿真器
- python爬去新浪微博_GitHub - dataabc/weiboSpider: 新浪微博爬虫,用python爬取新浪微博数据...
- 网络调试助手简单使用教程
- 微信发送图片php,PHP怎么实现微信图片上传到服务器?