当前位置: 首页 > 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;还可以利用别人写好…...

Qwen3.5-2B镜像免配置部署:开箱即用WebUI(7860端口)快速上手教程

Qwen3.5-2B镜像免配置部署&#xff1a;开箱即用WebUI&#xff08;7860端口&#xff09;快速上手教程 1. 模型简介 Qwen3.5-2B是通义千问系列中的轻量化多模态基础模型&#xff0c;仅有20亿参数规模&#xff0c;专为低功耗、低门槛部署场景设计。这个版本特别适合在端侧设备和…...

【卷积神经网络作业实现人脸的关键点定位功能】

下面是完成这道题目的代码&#xff1a;import os import cv2 import numpy as np import pandas as pd import torch import torch.nn as nn from torch.utils.data import Dataset,DataLoader from torchvision import transforms import matplotlib.pyplot as plt1. 数据集定…...

车载Android Auto兼容性开发全链路(车规级Java SDK集成手册)

第一章&#xff1a;车载Android Auto兼容性开发全链路概览Android Auto 是 Google 提供的车载信息娱乐系统集成框架&#xff0c;其兼容性开发并非仅限于应用层适配&#xff0c;而是一条横跨设备端、车机系统、认证流程与用户交互的完整技术链路。开发者需同步关注 Android 应用…...

Phi-4-mini-reasoning部署教程:Nginx反向代理+Basic Auth安全加固

Phi-4-mini-reasoning部署教程&#xff1a;Nginx反向代理Basic Auth安全加固 1. 项目介绍 Phi-4-mini-reasoning是一款由微软开源的轻量级AI模型&#xff0c;专注于数学推理、逻辑推导和多步解题等强逻辑任务。这个3.8B参数的模型虽然体积小巧&#xff0c;但在推理能力上表现…...

把openEuler当微服务跑:Docker Compose编排实战,管理Nginx+MySQL多容器应用

微服务架构下的openEuler容器化实践&#xff1a;NginxMySQL多容器编排指南 1. 云原生时代的轻量级操作系统选择 在容器化技术席卷全球的今天&#xff0c;开发者们越来越倾向于将操作系统本身也视为可编排的服务单元。openEuler作为一款专为云原生场景优化的Linux发行版&#xf…...

告别僵硬数字人:用InfiniteTalk V2的WebUI,让照片开口唱歌(保姆级参数设置指南)

告别僵硬数字人&#xff1a;用InfiniteTalk V2的WebUI&#xff0c;让照片开口唱歌&#xff08;保姆级参数设置指南&#xff09; 当一张静态照片突然流畅地唱起你上传的歌曲&#xff0c;嘴角弧度与歌词节奏完美匹配&#xff0c;甚至伴随旋律自然摆动头部——这种魔法般的体验&am…...

救命!电路板维修高频故障排查口诀,背会秒上手,修板快准稳

修板半天没头绪&#xff1f;工控伺服板一修就慌&#xff1f;测遍元件还烧板&#xff1f;其实电路板故障排查不用死磕&#xff0c;一套好记的速记口诀&#xff0c;能帮你少走弯路、少赔成本&#xff0c;新手能快速上手&#xff0c;老手直接拉高效率&#xff0c;刷到这篇干货&…...

大数据领域Hive与Spark的结合使用案例

大数据领域Hive与Spark的结合使用案例 关键词:Hive、Spark、大数据处理、数据仓库、分布式计算、ETL、数据分析 摘要:在大数据技术栈中,Hive作为基于Hadoop的数据仓库工具,擅长海量数据的存储与离线分析;Spark作为高性能分布式计算引擎,在复杂数据处理和实时计算领域表现…...

大多数人用AI还是“一次性聊天” Claude Cowork却让你把重复工作彻底扔上自动驾驶

花大价钱开了Claude Pro&#xff0c;每天扔进去一句“帮我写文案”“帮我优化内容”&#xff0c;结果用完就关窗口&#xff0c;下次还是从零开始&#xff1f;重复任务永远在偷走你的注意力&#xff0c;脑子里永远挂着“待办事项”这个隐形标签&#xff0c;效率看起来提升了&…...

C语言在嵌入式开发中的核心地位与实践技巧

1. 为什么C语言仍然是嵌入式开发的基石&#xff1f;作为一名在嵌入式行业摸爬滚打十年的老工程师&#xff0c;我见过太多人轻视C语言的重要性。直到现在&#xff0c;我面试的应届生中仍有超过60%对指针的理解停留在"变量地址"这种表层概念。但现实是&#xff0c;全球…...