当前位置: 首页 > 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来说明所调用的函数是在其他文件中定义的外部函数。

相关文章:

C语言中typedef和const的区别

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

大数据系列教程之 Kafka基础

kafka概述 一、kafka概述 1.1 定义1.2 消息队列 1.2.1 传统消息队列的应用场景1.2.2 消息队列的两种形式1.3 Kafka 基础架构二、kafka安装部署 2.1安装部署 2.1.1.jar包下载2.1.2.解压到指定的文件夹下2.1.3.创建两个文件夹以供后续使用2.1.4. 修改配置文件 (1&…...

【Go 基础篇】Go语言日期与时间函数详解:时间的掌控与转化

Go语言是一种快速、简洁且高效的编程语言,它在处理日期与时间方面提供了丰富的标准库函数。本文将详细介绍Go语言中处理日期与时间的函数,涵盖常用的日期时间操作、格式化、时区转换等内容,并介绍time.Time结构体中的相关方法。 时间的表示与…...

抽象工厂模式:创建相关对象族

欢迎阅读设计模式系列的第四篇文章!在前面的文章中,我们已经学习了设计模式的基本概念以及工厂方法模式的应用。 今天,我们将继续深入,介绍第三个模式——抽象工厂模式。 抽象工厂模式简介 抽象工厂模式是一种创建型设计模式&a…...

uniapp:安卓permission权限表及setting表

安卓permission权限表 权限名称说明android.permission.WRITE_USER_DICTIONARY允许应用程序向用户词典中写入新词android.permission.WRITE_SYNC_SETTINGS写入 Google 在线同步设置android.permission.WRITE_SOCIAL_STREAM读取用户的社交信息流android.permission.WRITE_SMS允…...

汽车服务门店小程序模板制作指南

在数字化时代,一个小程序的力量不可忽视。它不仅是展示品牌形象和提供用户服务的重要工具,更是扩大客户群体和提高营收的关键手段。对于汽车服务门店来说,拥有一个精美且功能齐全的小程序,更将成为你在竞争激烈的市场中的重要武器…...

Apache SeaTunnel 2.3.3 版本发布,CDC 支持 Schema Evolution!

时隔两个月, Apache SeaTunnel 终于迎来大版本更新。此次发布的 2.3.3 版本在功能和性能上均有较大优化改进,其中大家期待已久的 CDC Schema evolution(DDL 变更同步)、主键 Split 拆分、JDBC Sink 自动建表功能、SeaTunnel Zeta …...

工厂方法模式的概述和使用

目录 一、工厂方法模式概述1. 定义2. 使用动机 二、工厂方法模式结构1. 模式结构2. 时序图 三、工厂方法模式的使用实例四、工厂方法模式的优缺点五、工厂方法模式在Java中应用 原文链接 一、工厂方法模式概述 1. 定义 工厂方法模式(Factory Method Pattern)又称为工厂模式&…...

HP惠普星15青春版/惠普小欧笔记本电脑15s-du1008tx原装出厂Win11系统

适用型号:15s-du1007tx、15s-du1008tx、15s-du1009tx、15s-du1010tx、15s-du1011tx、15s-du1012tx、15s-du1013tx 自带所有驱动、出厂主题壁纸LOGO、Office办公软件、惠普电脑管家等预装程序 所需要工具:32G或以上的U盘 文件格式:ISO 文件大…...

聊聊检索增强,LangChain一把梭能行吗?

背景 ChatGPT诞生之初,大家仿佛从中看到了未来:可以拿着大语言模型(LLM)这把锤子,锤遍业务上的钉子。其中最被看好的场景,莫过于搜索,不仅是微软、谷歌、百度这样的大公司将LLM用到自己的搜索业…...

【力扣】343. 整数拆分 <动态规划、数学>

【力扣】343. 整数拆分 给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。返回可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出:…...

数据结构--5.1图的存储结构(十字链表、邻接多重表、边集数组)

目录 一、十字链表(Orthogonal List) 二、邻接多重表 三、边集数组 四、深度优先遍历 一、十字链表(Orthogonal List) 重新定义顶点表结点结构: datafirstInfirstOut 重新定义边表结构结点: tailV…...

mac上 Kratos 配置 protoc

前言 protoc 是 protobuf 文件(.proto)的编译器,可以借助这个工具把 .proto 文件转译成各种编程语言对应的源码,包含数据类型定义、调用接口等。 protoc 在设计上把 protobuf 和不同的语言解耦了,底层用 c 来实现 protobuf 结构的存储&#x…...

【c++5道练习题】①

目录 一、有限制的累加 二、计算日期到天数转换 三、仅仅反转字母 四、 字符串的第一个唯一字符 五、字符串最后一个单词的长度 一、有限制的累加 题述: 求123...n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句…...

最佳实践:TiDB 业务读变慢分析处理

作者:李文杰 网易游戏计费 TiDB 负责人 在使用或运维管理 TiDB 的过程中,大家几乎都遇到过 SQL 变慢的问题,尤其是查询相关的读变慢问题。读变慢的问题大部分情况下都遵循一定的规律,通过经验的积累可以快速的定位和优化&#xff…...

【ES6】Getter和Setter

JavaScript中的getter和setter方法可以用于访问和修改对象的属性。这些方法可以通过使用对象字面量或Object.defineProperty()方法来定义。 以下是使用getter和setter方法的示例&#xff1a; <!DOCTYPE html> <script>const cart {_wheels: 4,get wheels(){retu…...

3DS Max中绘制圆锥箭头

3DS Max中绘制圆锥箭头 绘制结果绘制过程步骤一&#xff1a;绘制立体圆锥方法1方法2 步骤二&#xff1a;圆锥体调参&#xff08;模型尺寸设置&#xff09;1圆锥体参数说明2圆锥体参数调整 步骤三&#xff1a;绘制圆柱体步骤四&#xff1a;圆柱体调参步骤五&#xff1a;圆锥与圆…...

虚拟机Ubuntu20.04 网络连接器图标开机不显示怎么办

执行以下指令&#xff1a; sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start...

你真的知道什么是USB Server吗?一分钟了解

很多公司都在用USB Server&#xff0c;效率大幅提高&#xff0c;但也还有不少人不知道USB Server到底是什么、干嘛用的。 USB Serve是帮助企业远程连接和集中管控USB设备的服务器 它的主要用途就是异地远程连接USB。 如&#xff0c;虚拟化环境的加密狗、前置机连接&#xff0…...

Node.js 中间件是怎样工作的?

express自带路由功能&#xff0c;可以侦听指定路径的请求&#xff0c;除此之外&#xff0c;express最大的优点就是【中间件】概念的灵活运用&#xff0c;使得各个模块得以解耦&#xff0c;像搭积木一样串起来就可以实现复杂的后端逻辑。除此之外&#xff0c;还可以利用别人写好…...

LumiPixel开箱即用教程:快速上手这个专为人像设计的AI创作平台

LumiPixel开箱即用教程&#xff1a;快速上手这个专为人像设计的AI创作平台 1. 认识LumiPixel&#xff1a;纯净人像创作平台 LumiPixel: Canvas Quest是一款专注于人像创作的AI视觉平台&#xff0c;它将先进的Z-Image扩散模型与复古像素艺术美学完美结合。这个平台特别适合需要…...

Blender 3MF插件终极指南:从零开始掌握3D打印文件格式

Blender 3MF插件终极指南&#xff1a;从零开始掌握3D打印文件格式 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 3MF&#xff08;3D Manufacturing Format&#xff09;格…...

别再死记硬背GAT公式了!用Python+PyTorch手把手图解注意力机制(附代码)

图解GAT&#xff1a;用PythonPyTorch拆解图注意力机制的实现奥秘 当你第一次听说图注意力网络&#xff08;GAT&#xff09;时&#xff0c;是否被那些复杂的数学公式和抽象概念吓退&#xff1f;本文将以全新的可视化方式&#xff0c;带你从零实现一个完整的GAT层&#xff0c;用代…...

SiameseUIE部署指南:test.py中custom_entities字段详解

SiameseUIE部署指南&#xff1a;test.py中custom_entities字段详解 1. 概述 如果你正在使用SiameseUIE模型进行信息抽取&#xff0c;那么test.py脚本中的custom_entities字段就是你最需要关注的核心配置。这个看似简单的字段&#xff0c;实际上决定了模型如何精准地从文本中抽…...

手把手教你部署DeepSeek-OCR:零基础实现多语言文字识别

手把手教你部署DeepSeek-OCR&#xff1a;零基础实现多语言文字识别 1. 为什么选择DeepSeek-OCR 在数字化时代&#xff0c;文字识别技术已经成为各行各业的基础需求。无论是扫描文档转电子版&#xff0c;还是从照片中提取文字信息&#xff0c;传统OCR工具往往在复杂场景下表现…...

基于Xinference-v1.17.1的嵌入式Linux开发指南

基于Xinference-v1.17.1的嵌入式Linux开发指南 1. 引言 嵌入式设备上的AI推理一直是个技术挑战&#xff0c;特别是在资源受限的环境中部署大模型。Xinference-v1.17.1作为一个开源推理框架&#xff0c;为嵌入式Linux系统提供了轻量级的AI模型部署方案。无论你是想在树莓派上运…...

为什么92%的FastAPI流式AI项目在高并发下崩溃?深度解析event loop争用、response.body迭代器生命周期与uvicorn worker模型冲突

第一章&#xff1a;FastAPI 2.0流式AI响应的高并发失效现象全景透视当FastAPI 2.0被用于承载大语言模型&#xff08;LLM&#xff09;的SSE&#xff08;Server-Sent Events&#xff09;或分块Transfer-Encoding: chunked流式响应时&#xff0c;大量并发请求下常出现连接提前终止…...

PyTorch 2.8镜像实际项目:电商短视频自动生成平台从0到1部署纪实

PyTorch 2.8镜像实际项目&#xff1a;电商短视频自动生成平台从0到1部署纪实 1. 项目背景与需求分析 电商行业正面临内容生产的巨大挑战。每天需要制作大量商品展示视频&#xff0c;传统方式需要专业团队拍摄剪辑&#xff0c;成本高、周期长、效率低。我们团队决定基于PyTorc…...

如何确保usearch内存安全:Safe C++与Rust的终极对比指南

如何确保usearch内存安全&#xff1a;Safe C与Rust的终极对比指南 【免费下载链接】usearch Fastest Open-Source Search & Clustering engine for Vectors & &#x1f51c; Strings in C, C, Python, JavaScript, Rust, Java, Objective-C, Swift, C#, GoLang, and …...

Graph Node高级配置:环境变量与配置文件详解

Graph Node高级配置&#xff1a;环境变量与配置文件详解 【免费下载链接】graph-node Graph Node indexes data from blockchains such as Ethereum and serves it over GraphQL 项目地址: https://gitcode.com/gh_mirrors/gr/graph-node Graph Node 作为区块链数据索引…...