9.28 标识符的作用域与可见性,指定关键字(auto,static,register,extern),预处理 编译 汇编 链接,宏定义,带参宏
标识符的作用域 与 可见性问题:说明:1.变量名2.函数名3.数组名作用域:发挥作用区域{} //C语言中 一个 {} 就是一个作用域作用域:局部作用域只要是在{} 范围内的 都是局部作用域局部作用域定义的变量 --- 局部变量全局作用域不在任何一个 {} 范围内的是全局作用域全局作用域定义的变量 --- 全局变量可见性:站在程序角度看程序运行到某一刻时哪些标识符可见(可用)标识符的可见性的规则:1.先定义后使用2.同一作用域中不能有同名标识符3.在不同的作用域同名标识符相互之间没有影响4.如果是不同的作用域但是作用域之间存在嵌套关系 则内层的作用域的同名标识符会屏蔽外层的作用域的同名标识符。 (就近原则)C语言5个区:栈堆全局区(静态区)字符串常量区代码区存储类别关键字:main(){int a 10; //局部变量 --- 定义变量 意味着开空间 --- 空间开在哪里}指定关键字 来表示 数据可以放到哪来auto int a 10; //auto 就表示这个变量空间开在栈上static int a 10; //static 静态的 表示将变量 空间 开在 静态区//静态区变量的特点:// 1.只会被初始化一次// 2.不能用变量初始化// 全局变量也不能用变量初始化 --- 全局变量和静态变量都是放在全局区(静态区)// 3.静态局部变量的值具有继承性从变量角度看空间上:局部变量全局变量时间上:生命周期局部变量 的生命周期 ---从定义处开始到所在作用域结束//程序执行到定义时变量创建程序执行到 作用域结束 变量销毁全局变量静态变量 的生命周期 ---程序运行开始后就存在直到整个程序结束才销毁./a.out(整个程序的生命周期)register int a 10; //register --- 寄存器//告诉编译器 将变量a 存放到 寄存器中//关键字 ---- 建议性关键字//考点// 如果是register修饰的变量// 不能做 (取地址)运算// 原因 --- 内存空间可以取地址寄存器取不了拓展计算机的存储体系:寄存器cache内存硬盘从上到下容量越来越大价格越来越便宜速度原来越慢CPU 内存 硬盘unsigned int i 0;for (i 0; i INT_MAX; i){}//声明extern int a; //extern --- 外部的意思 --- extern相当于是扩展了变量的作用域//相当于将a的作用域扩展到本文件//修饰表示变量存储在别的文件中要使用式到别的文件中寻找extern 和 staticstatic也可以修饰全局变量,表示 将该变量的作用域限定为本文件别的文件中无法引用(extern int a;) //static修饰全局变量 --- 限定了作用域也可以修饰函数//多文件编程作用和修饰全局变量作用相同用途分模块好多个函数全局变量 int cnt;函数static保护数据作用关键字:autostatic //背诵的第一个面试问题// 你知道static吗// 解释registerextern预处理命令:#include stdio.h //预处理命令C提供的预处理功能主要有以下3种1. 宏定义2. 文件包含3. 条件编译注意:1.所有的预处理命令 都 以 # 井号开头编译:gcc hello.c //编译实际的编译过程:预处理:将程序中的预处理命令执行完将代码处理成 纯的C语言代码编译:将预处理完的文件进行语法词法分析检查问题生成 一份 汇编代码汇编:将 前面的汇编代码最终翻译成机器代码链接:将用到的第三方代码 链接(拼接)成为 最终可执行程序预处理:gcc -E hello.c -o hello.i编译:gcc -S hello.i -o hello.s汇编:gcc -c hello.s -o hello.o链接:gcc hello.o -o hello1. 宏定义#define 标识符 字符串#define 宏名 宏值作用:用宏名代替 一串文本信息注意:1. 宏名 --本质还是一个标识符2. 宏名 建议 大写3. 宏名 --符号常量用了一个 符号(宏名) 代替 常量值4. 宏工作的本质文本原样替换但是:代码中出现在 双引号中的 宏名 不会被替换5. 用途可以用宏名 来代替一些常量符号常量好处可以做到一改全改可以提高代码可读性#define ARRAY_SIZE 10int array[ARRAY_SIZE]练习:计算一下 圆的周长和面积带参宏:#define 宏名(参数表) 宏值说明:1.带参宏 可以 给一些参数形式 特别像函数调用宏函数2.带参宏 和 函数有本质的区别a.函数的参数 是带类型的b.带参宏 参数没有类型 --就是文本c.函数什么时候可以用程序运行之后d.带参宏在预处理阶段就处理完了3.带参宏 工作过程本质上还是文本原样替换参数是一一对应的4.带参宏副作用建议 能加括号都加括号可能会改变的值我们建议都加括号5.所有宏定义以换行作为结束符6.宏的作用域从定义出开始往下都发挥作用取消宏的作用域#undef 宏名eg两个数相乘int mul(int a,int b){return a * b;}#define MUL(a,b) a*bMUL(12,34) 12*34#define MUL(a,b) ((a)*(b))练习:实现一个宏找出两个数的最大值[预处理]:1.预处理 不是 c语言的一部分2.预处理 命令 都是以 # 开头3.宏定义工作的过程 (本质)文本替换4.文件包含5.条件编译预处理---本质上都是做做文本替换文件包含:#include 文件名 //默认到系统的标准路径下寻找要包含的头文件#include 文件名 //双引号 默认先到当前位置下 寻找要包含的头文件如果找到则包含进来// 如果没找到才到系统的标准路径下寻找#include stdio.h说明:1. include 这个预处理命令执行之后用文件中的内容 替换这个 命令所在位置2. 将来使用 //如果是系统的相关头文件 --- 用 //如果是自己写的 一般用 条件编译:#if 0......#endif(1)#ifdef 标识符程序段1#else程序段2#endif语义:判断 标识符 是否定义了如果定义了 ---真选择 程序段1如果没定义 ---假选择 程序段2#ifdef 标识符程序段1#endif满足条件的时候 添加 程序段1不满足条件时候啥都没有(2).#ifndef 标识符程序段1#else程序段2#endif语义:没有定义 标识符 则选择程序段1有定义 标识符 则选择程序段(3).#if 表达式程序段1#else程序段2#endif#if 表达式程序段#endif#if 0......#endif用途:可以用来实现 多文件编程printf //系统里面的函数#include stdio.hprintf();实现好的功能 .c 独立的c程序提供 或者 打包成库文件.c //写好了功能的点c文件.c 对应 有一个 .h (头文件).c --- 就是实现功能的具体代码 ---函数.h --- 头文件 --放的是 自身需要用到 宏 类型说明 函数声明 //变量的定义 不能放头文件//全局的int a 10; //a一定得开空间extern int a; //说明:头文件包含注意 --- 一定要写#ifndef 头文件名 //要大写 前后 下划线#define 头文件名#endif命令:vsp //竖着分屏sp窗口之间切换:ctrl 两下w编译:所有 .c 一起编译gcc main.c isLeapYear.c getAllDays.c .....//这些需要一起编译

相关新闻

TWS 耳机充电盒单线通信协议深度解析:借道充电 IC 的半双工 UART 架构与实现机制

TWS 耳机充电盒单线通信协议深度解析:借道充电 IC 的半双工 UART 架构与实现机制

TWS 耳机充电盒单线通信协议深度解析:借道充电 IC 的半双工 UART 架构与实现机制 文章目录 TWS 耳机充电盒单线通信协议深度解析:借道充电 IC 的半双工 UART 架构与实现机制 前言 一、总体认识:一根线怎么跑双向通信 1.1 一句话定性 1.2 三个容易踩的认知坑 1.3 核心事实速览…

2026/9/30 2:48:01 阅读更多 →
BES 平台 iAP2 模块深度解析:Apple 蓝牙附件服务的初始化链、EA 会话与 TWS 一致性

BES 平台 iAP2 模块深度解析:Apple 蓝牙附件服务的初始化链、EA 会话与 TWS 一致性

BES 平台 iAP2 模块深度解析:Apple 蓝牙附件服务的初始化链、EA 会话与 TWS 一致性 文章目录 BES 平台 iAP2 模块深度解析:Apple 蓝牙附件服务的初始化链、EA 会话与 TWS 一致性 前言 一、总体认识:一条横跨三层的能力链 1.1 一句话定位 1.2 配置层差异:别被 target 默认值…

2026/9/30 2:48:01 阅读更多 →
OpenStack云平台搭建与Ceph分布式存储安装测试全指南

OpenStack云平台搭建与Ceph分布式存储安装测试全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/30 2:48:01 阅读更多 →

最新新闻

WiFi-DensePose:当路由器成为隐形雷达,解锁无线人体姿态感知

WiFi-DensePose:当路由器成为隐形雷达,解锁无线人体姿态感知

先抛个问题:你家里的路由器,除了上网,还能干什么?在WiFi-DensePose出现之前,很多人可能觉得这个问题没有第二个答案。但如果你最近刷到了GitHub上那个挂着18.5K Star的项目,就会意识到,路由器摇…

2026/9/30 3:40:33 阅读更多 →
MySQL密码加密存储与查询实战:从bcrypt选型到JDBC集成

MySQL密码加密存储与查询实战:从bcrypt选型到JDBC集成

接手过一个老项目,用户表里的password字段存的直接是明文。后来某天备份文件泄露,几万条手机号和明文密码一起流出,那场面至今想起来都头皮发麻。用户密码在 MySQL 里的加密存储、查询和验证,算是每个后端开发者都绕不开的话题了&…

2026/9/30 3:40:33 阅读更多 →
开题答辩实战:校园扶助综合服务平台设计与实现全流程解析

开题答辩实战:校园扶助综合服务平台设计与实现全流程解析

答辩结束、签字确认的那一刻,我总算可以松口气了。这次开题,我选的题目是《校园扶助综合服务平台的设计与实现》,整个过程从定方向、做调研、写开题报告,再到现场面对四位评委的连环提问,跨度整整三周。回头去看&#…

2026/9/30 3:40:33 阅读更多 →
2026自助建站系统怎么选?四大流派与避坑指南

2026自助建站系统怎么选?四大流派与避坑指南

最近我常被问到同一个问题:2026年了,到底该选哪款自助建站系统?很多人的潜台词是“给我推荐一个最好用的”。但做了这么多年网站,我的真实感受是:这个问法本身就有问题。没有最好用的系统,只有和你的目标、…

2026/9/30 3:40:33 阅读更多 →
MySQL视图、存储过程与触发器实战:从权限坑到性能陷阱

MySQL视图、存储过程与触发器实战:从权限坑到性能陷阱

接手过几个线上MySQL库之后,你会发现一个规律:凡是数据模型稳定、查询路径清晰的系统,视图、存储过程和触发器这三样东西一定用得恰到好处;凡是后期维护到想骂人的库,多半是这三样被用歪了。这篇就把它们挨个拆开讲透—…

2026/9/30 3:40:33 阅读更多 →
n8n实战:Docker部署AI工作流自动化,从定时抓取到Agent机器人

n8n实战:Docker部署AI工作流自动化,从定时抓取到Agent机器人

最近总有朋友问我,AI到底怎么落到日常工作里,天天跟模型聊天也聊不出生产力。说实话,我自己也是踩了不少坑才想明白:模型再强,也只是一颗聪明的“大脑”,真正让它开始干活,得把“大脑”接到手脚…

2026/9/30 3:39:33 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →