什么是定义?什么是声明?它们有何区别?
举个例子:
A)int i;
B)extern int i; (关于 extern,后面解释)
哪个是定义?哪个是声明?或者都是定义或者都是声明?我所教过的学生几乎没有一
人能回答上这个问题。这个十分重要的概念在大学里从来没有被提起过!
什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它
取上一个名字,这个名字就是我们经常所说的变量名或对象名。但注意,这个名字一旦和
这块内存匹配起来(可以想象是这个名字嫁给了这块空间,没有要彩礼啊。 ^_^),它们就同
生共死,终生不离不弃。并且这块内存的位置也不能被改变。一个变量或对象在一定的区
域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义
同一个变量或对象。
什么是声明:有两重含义,如下:
第一重含义:告诉编译器,这个名字已经匹配到一块内存上了(伊人已嫁,吾将何去何
从?何以解忧,唯有稀粥),下面的代码用到变量或对象是在别的地方定义的。声明可以出
现多次。
第二重含义:告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量
名或对象名。比如你在图书馆自习室的某个座位上放了一本书,表明这个座位已经有人预
订,别人再也不允许使用这个座位。其实这个时候你本人并没有坐在这个座位上。这种声
明最典型的例子就是函数参数的声明,例如:
void fun(int i, char c);
好,这样一解释,我们可以很清楚的判断:A)是定义; B)是声明。
那他们的区别也很清晰了。记住, 定义声明最重要的区别:定义创建了对象并为这个
对象分配了内存,声明没有分配内存(一个抱伊人,一个喝稀粥。 ^_^)。

声明(declaration )指定了一个变量的标识符,用来描述变量的类型,是类型还是对象,或者函数等。声明,用于编译器(compiler)识别变量名所引用的实体。以下这些就是声明:
extern int bar;
extern int g(int, int);
double f(int, double); // 对于函数声明,extern关键字是可以省略的。
class foo; // 类的声明,前面是不能加class的。
定义是对声明的实现或者实例化。连接器(linker)需要它(定义)来引用内存实体。与上面的声明相应的定义如下:
int bar;
int g(int lhs, int rhs) {return lhs*rhs;}
double f(int i, double d) {return i+d;}
class foo {};// foo 这里已经拥有自己的内存了,对照上面两个函数,你就应该明白{}的用处了吧?
无论如何,定义 操作是只能做一次的。如果你忘了定义一些你已经声明过的变量,或者在某些地方被引用到的变量,那么,连接器linker是不知道这些引用该连接到那块内存上的。然后就会报missing symbols 这样的错误。如果你定义变量超过一次,连接器是不知道把引用和哪块内存连接,然后就会报 duplicated symbols这样的错误了。以上的symbols其实就是指定义后的变量名,也就是其标识的内存块。
总结:
如果只是为了给编译器提供引用标识,让编译器能够知道有这个引用,能用这个引用来引用某个实体(但没有为实体分配具体内存块的过程)是为声明。如果该操作能够为引用指定一块特定的内存,使得该引用能够在link阶段唯一正确地对应一块内存,这样的操作是为定义。声明是为了让编译器正确处理对声明变量和函数的引用。定义是一个给变量分配内存的过程,或者是说明一个函数具体干什么用。转自: c语言中声明和定义的区别

C语言再学习 -- 声明与定义相关推荐

  1. C语言再学习 -- 存储类型关键字

    定义: 是对声明的实现或者实例化.连接器(linker)需要它(定义)来引用内存实体.与上面的声明相应的定义如下:参看:C语言再学习 -- 存储类.链接 C语言中有 5 个作为存储类说明符的关键字,分 ...

  2. C语言再学习--关键字

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/53021879 C语言一共有32个关键字,如下表所示: 关键字 说明 auto ...

  3. C语言再学习 -- 详解C++/C 面试题 2

    (经典)C语言测试:想成为嵌入式程序员应知道的0x10个基本问题. 参看:嵌入式程序员面试问题集锦 1.用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define ...

  4. C语言再学习 -- 详解C++/C 面试题 1

    参看:<高质量C++ C编程指南>.林锐 对这篇文章记忆犹新,因为之前找工作面试的时候,遇到过一家公司就是用的这套面试题.现在就结合考查的知识点和我总结完 C 语言再学习后的深入理解,来详 ...

  5. C语言再学习 -- 再论数组和指针

    之前有总结指针数组,但是现在看来总结的太简单了.好多重要的知识点都是一带而过的.本想在后面添加后来想想算了,还是再写一篇文章来详细介绍数组和指针这对冤家吧. 之前总结的,参看:C语言再学习 -- 数组 ...

  6. C语言再学习 -- 时间函数

    在软件设计中经常会用到关于时间的处理,用来计算语句.函数的执行时间,这时就需要精确到毫秒甚至是微妙的时间.我们首先来介绍一下,时间单位: 时间单位还有:秒(s).毫秒(ms).微秒 (μs).纳秒(n ...

  7. C语言再学习 -- 关键字volatile

    上周确实事情挺多的,年会.公司聚餐,一到过年就有忙不完的事分心.还好C语言再学习总结的已经差不多了,年前也不展开别的了,接下来这十几天.总结几篇典型的面试题吧. 言归正传,接下来看看关键字 volat ...

  8. C语言再学习 -- 关键字const

    const 关键字其实我们并不陌生,之前有讲过const修饰数组和指针.现在来详细介绍这个关键字. 参看:[C/C++和指针]著名的<const的思考> 一.const 介绍 1.cons ...

  9. C语言再学习 -- 关键字typedef

    参看:C语言再学习 -- 结构和其他数据形式 参看:C语言再学习 -- 关键字struct(转) 参看:常见typedef 用法 参看:关于typedef的用法总结 一.typedef 介绍 type ...

最新文章

  1. 民间的 Pokémon 知识图谱
  2. c++ 四舍五入保留两位小数_Excel中保留小数点位数
  3. 在HTML中英文换行问题
  4. 2021-07-21新技术赋能数智财会,用友YonBIP财务云激活企业创新能力
  5. javafx + jfoenix相关学习资料地址整理
  6. java 数据库工厂_月光软件站 - 编程文档 - Java - 简单的数据库连接工厂实现
  7. 一致 先验分布 后验分布_分布式事务常见解决方案与最终一致性
  8. dc/os_DC / OS中具有Java和数据库应用程序的服务发现
  9. “两小学生研究喝茶抗癌获奖”,官方回应:经老师培训独立完成
  10. 今天的天气好热哦!!!
  11. 【redis】redis 各种数据类型应用和实现方式
  12. 3Dslicer中 PET/CT 模块:PET Standard Uptake Value Computation
  13. JavaScript对象的理解
  14. MacOS 10.14.5单双面打印设置
  15. 基于iTextSharp(C#)创建PDF文件
  16. 【Arcgis】球面坐标系转投影坐标
  17. 使用MeGUI的一些问题及个人解决方案,仅作个人备注使用。
  18. python opencv把一张图片嵌入(叠加)到另一张图片上
  19. windows xp系统账号密码忘记解决办法
  20. C++ string 转化为LPCTSTR

热门文章

  1. 嘿!不用太过于担心的单点故障
  2. cas中总是得不到返回的属性
  3. Apache+jboss群集部署
  4. typedefnbsp;struct与struct的区别
  5. NSDictionary和NSMutableDictionary good
  6. 草根版创业网站学巴菲特售时间 获天使投资
  7. 语音信号处理MATLAB实现
  8. 英语写作中常见语法总结(一)
  9. 冒泡排序python实现
  10. 【算法】SVM分类精度为0,结果很烂怎么办?