当前位置: 首页 > news >正文

C语言中typedef和const的区别

昨天面试的时候面试官问了这个问题,平时也有见过这两个类型限定词,可能是因为不怎么使用的原因,当问到它们的区别时,我不知道从哪个方面开始回答。

用 typedef 定义新的类型名

类型定义的书写格式为

typedef 类型 被定义的类型名

被定义类型名通常用大写字母构成。从语法形式上看,typedef出现在“类型”的左边,类似于 extern、static 等存储类区分符在说明中所占的位置,实际上typedef不保留存储空间,只是为了语法上方便,才称它为“存储类区分符”。

typedef char *STRING;

typedef int MILES, *SP, (*PF)();

显然,MILES与int同义,而SP与指向int型的指针同义,STRING与字符指针同义,PF与指向函数(返回int型)的指针同义。

必须强调,typedef说明并不产生新的类型,只是给已有的类型添加新的类型名,或者说以另一种方式来指出类型而已。使用这种方式说明的变量与关键字明确指出类型的那些变量具有同样的性质。

使用typedef说明的主要原因有两个:

1. 使说明便于理解。用这种类型定义方式,使指向复杂结构的指针的说明方式简洁明了。

2. 将程序参数化,以便移植。若typedef用在与机器有关的数据类型中,当程序移植时,只要改变typedef就可以了。通常情况是对不同的整数量使用typedef所产生的名,因而每个宿主机能够挑选出与short、int和logn适应的集合。

最终,将来总可以让编译程序或其它程序(如lint),用typedef说明中的信息来对程序进行附加的检查。

这里说的是不是在debug的时候,可以通过typedef定义的变量名,更方便找到问题出现的位置。

类型限定词

C语言中有两个关键字称为类型限定词:const和volatile。前者将对象限定为常量,后者将对象限定为易变量。

类型限定词的书写位置在类型名(即类型区分符)之首,当有存储类区分符时,声明中各词的次序可为:

类型限定词 存储类区分符 标识符

存储类区分符 类型限定词 标识符

被const限定的对象,在一次定值后,不允许再赋值或增量、减量。

需要注意C语言中const的用法与PASCAL中的const不完全相同,其特点是:

1. 类型限定词的作用在遇到分号时就停止了。

2. 聚集类型的规格说明中也可以包含限定词,如下面的标识符a就被限定为数组常量名:

typedef int AT[2][3]; /* AT是2行3列的整数型数组名 */
const AT a = {{4, 5, 6}, {7, 8, 9}}; /* a是AT型数组,其元素是const int型 */

3. 为使两个限定类型相容,则二者都应为相容类型的完全相同的限定形式。因此若在以上声明中增添下列两条:

int *pi;
const int *pci;

则语句 pci = &(a[0][1]); 是有效的,而语句 pi = &(a[0][1]); 无效,因为等号两边的类型不匹配。不过有些编译器并未严格按照C语言标准去实现。因此,语句 pi = &(a[0][1]); 仍可能通过编译。

4. 如果对程序中的一些变量,人们不希望编译器对它的计算顺序进行任何优化或重新排序,则在声明时应当用限定词 volatile 进行约束。这在描述对应于存储映射的输入输出端口的对象,或由异步中断函数访问的对象时经常用到,如:

extern const volatile int real.time.clock;

则 real.time.clock可被硬件在程序员不确切知道的情况下进行修改,但编译器不会对它进行计算顺序的变更。

5. 同一对象可以受两个不同限定词的约束,例如声明为

extern const volatile int real.time.clock;

的对象,除了(4)中的叙述特点外,还受不能被赋值,增量或减量的限制。

内部函数与外部函数

对于比较大的程序,通常分放在多个源文件中,也称为多源文件(multy files)。因为每个文件是一个编译单元,于是修改某个源文件时不必重新编译其它的源文件。这种文件结构还便于多人分别编写与调试程序。采用多文件结构时,对各个文件中的变量与函数的定义与使用应当相互协调,这不仅涉及到正确运用变量的存储类,还要掌握内部函数等概念。

1. 内部函数

内部函数只能被本程序文件中其他函数所调用。内部函数的定义方法是在函数的类型前加static,即:

static 类型标识符 函数名(数据类型 形式参数1, 数据类型 形式参数2, ...) {

         函数体       

}

内部函数又称静态函数。使用内部函数可以使函数只局限于所在文件,即不同的文件中有相同函数名的函数也不会相互干扰。这在多人同时编写一个程序的不同部分的时候特别有用。通常把只由同一文件使用的函数和外部变量放在一个文件中,用static加以说明使之局部化,限制其他文件对其引用。

2. 外部函数

外部函数的定义方法是在函数的类型标识符名前加extern,即

extern 类型标识符 函数名(数据类型 形式参数1,数据类型 形式参数2,...){

        函数体

}

如果在定义函数时省略extern,则默认为外部函数。在需要调用此函数的文件中对此函数进行原型声明时,一般也要用extern来说明所调用的函数是在其他文件中定义的外部函数。

http://www.lryc.cn/news/148592.html

相关文章:

  • 大数据系列教程之 Kafka基础
  • 【Go 基础篇】Go语言日期与时间函数详解:时间的掌控与转化
  • 抽象工厂模式:创建相关对象族
  • uniapp:安卓permission权限表及setting表
  • 汽车服务门店小程序模板制作指南
  • Apache SeaTunnel 2.3.3 版本发布,CDC 支持 Schema Evolution!
  • 工厂方法模式的概述和使用
  • HP惠普星15青春版/惠普小欧笔记本电脑15s-du1008tx原装出厂Win11系统
  • 聊聊检索增强,LangChain一把梭能行吗?
  • 【力扣】343. 整数拆分 <动态规划、数学>
  • 数据结构--5.1图的存储结构(十字链表、邻接多重表、边集数组)
  • mac上 Kratos 配置 protoc
  • 【c++5道练习题】①
  • 最佳实践:TiDB 业务读变慢分析处理
  • 【ES6】Getter和Setter
  • 3DS Max中绘制圆锥箭头
  • 虚拟机Ubuntu20.04 网络连接器图标开机不显示怎么办
  • 你真的知道什么是USB Server吗?一分钟了解
  • Node.js 中间件是怎样工作的?
  • Spring MVC: 请求参数的获取
  • 别再头疼反弹Shell失败了,这篇文章带你找到问题根源
  • 第五章 树与二叉树 四、线索树(手算与代码实现)
  • 服务器前后端学习理解
  • python-数据分析-numpy、pandas、matplotlib的常用方法
  • ChatGPT⼊门到精通(5):ChatGPT 和Claude区别
  • ChatGPT 总结数据分析的所有知识点
  • hadoop-HDFS
  • 0202hdfs的shell操作-hadoop-大数据学习
  • 生活小记-挂号信
  • 3D点云处理:基于PCA的计算点云位姿(占位待整理)