1. 警告和出错
1.1 Warnning
警告:编译器认为代码写得不合理,但符合语法,可以通过编译,但程序运行可能产生意外的结果。
一个 char 类型的数据,在多数平台上,只能存储 -128 ~ 127 范围的数值,但代码将 128 赋值给一个 char 数据,即可获得一个警告:数据溢出;而不是一个错误。
1.2 Error
出错:即代码存在语法错误,无法通过编译。
将一个整数,赋值给一个字符串类型的数据。
2. 声明和定义
现实生活中我们做不少事情,会有一个规划或设计的阶段,此时并不需要将做此事所需要的所有事物,都摆在眼前,才能做这个规划或设计。
比如,你想为新房配置一个彩电。那么,你可以做如如下两个 “声明”。
- 声明一:主卧这面墙,将挂一块 100 吋的超薄彩电,品牌为 瑞幸;
- 声明二:客厅这面墙,将挂一块 200 吋的超薄采电,品牌为 华为;
这就叫声明。声明虽然不是实物,但描述得越具体越好。比如上例,可认为是描述了几个特征:
- 电器类型(彩电)
- 外观特点(超薄)
- 关键指标(100吋和200吋)
- 品牌(瑞幸、华为)
实际还可以加上颜色、价格等特征描述……试想,如果设计师问你家里要不要电视?你回答“随便”;问你彩电你喜欢什么品牌?你回答“随便”;问你想要多大的,你回答“随便”……除非遇上“大师”,否则,普通的设计师都不敢接你的活。
C++是一门严谨的语言,讲究凡事要有出处(参看隔壁课堂:从机器指令到高级语言 )。代码里要用到某个数据,如果既不给出实物(定义,defined),又不给出相对详细的说明(声明,declared),通常就会报错误。
假设设计师(相当于编译器接受你以上关于电视的声明,开始做相关设计;甚至,为了做出更好的设计效果真,他甚至可以请师傅切割硬纸板,做两个尺寸分别是100和200的假电视,挂在墙上,东看看、西看看……
一切都挺好,然后,真的要开始装修时,负责办理物料实施工发出施工错误报告:
- 错误一:市场上有 100 吋的超薄彩电,但没有瑞幸品牌的彩电;
- 错误二:市场上有华为超薄彩电,但他们家暂时不生产200吋的。
负责实施的工队,就叫链接器。此处的“链接”,就相当于将设计中要用到的各种东西,都一一落实并组装起来。每一个用到,且能落实的事物,就叫 “有定义的(defined)”对象;而找不到的东西,叫 “未定义的(undefined)”对象。
所以,请理解上面的错误,实质是在表达:
- 瑞幸牌的100吋超薄彩电——抱歉,未定义!
- 华为家的200吋超薄彩电——抱歉,未定义!
上面报的两个错误,可以叫“链接”错误。
不过,广义上的“编译”,也包含了“链接”过程,因此本文将上述的错误,也称为编译错误。