编译上下文

文章目录

  • 作用域、可见性
    • 函数作用域
    • 文件作用域
    • 语句块作用域
    • 函数原型作用域
  • 标识符的存储类型
    • 全局对象与函数
    • 静态对象与函数
    • 局部对象

作用域、可见性

一个变量标识符只有在特定的某段儿程序区域(作用域)内才可以起作用(可见性)。

总共有四种作用域:函数作用域、文件作用域、语句块作用域、函数原型作用域

函数作用域

跳转标签(就是goto的label)是仅有的函数作用域的标识符,使用时,会与goto配合出现。

它不会受其他语句块儿的干扰,只要是在所处的函数里,什么地方都可以起作用。

int main() {int count = 3;HELLO_LABEL:puts("hello \n");if(-- count > 0) {goto HELLO_LABEL;}switch(count) {case 1: count = 0; break;case 0: count = 3;SWITCH_INNER_LABEL:printf("inside switch! \n");break;default :break;}if(-- count > 0) {goto SWITCH_INNER_LABEL;}
}

SWITCH_INNER_LABEL尽管是在switch的语句块儿里定义的,但还是可以从外部访问到。

文件作用域

文件作用域,即从它声明开始到文件结束都是可见的。

在所有函数外定义的标识符称为全局标识符,比如全局变量、函数声明、头文件中的标识符、宏定义。

#include <stdio.h>         // 头文件中的
#define macro 10           // 定义的宏变量
int global_variable = 10;  // 全局变量
void fun(void);            // 函数声明中的函数int main() {/* do something */return 0;
}void fun(void) {/* do something */return ;
}

语句块作用域

声明出现在一个语句块儿里、或是函数定义的形参列表中。

  • 当标识符的作用域完全相同时,不允许出现相同的标识符名,而当标识符有不同作用域时允许标识符同名。

  • 如果是作用域嵌套的情况下,如果内层和外层的作用域声明了同名的标识符,那么在外层作用域中声明的标识符对于该内层作用域时不可见的。

int main() {int i = 0;{int i = 2;				// 这里内部的i起作用,可见printf(“i2 = %d”, i);	// i的值为2i += 2;					}i ++;						// 这里外部的i起作用,可见printf(“i1 = %d”, i);	    // 1
}

函数原型作用域

就是在函数原型声明里的标签

int fun(int argc, char** argv);

比如这里的argcargv???

标识符的存储类型

全局对象与函数

extern声明的对象,或者缺省(无extern或static修饰)的函数具有外部链接。

能够被extern修饰的函数或对象是全局的,只要提前声明,则该对象和函数可在所有文件内可见。

在test.c中

extern int a;
void test(void) {a = 10;
}

在main.c中

#include <stdio.h>
extern void test(void)int a;       // 全局变量a的声明
int a = 10;  // 全局变量a的初始化(声明+定义)int main() {extern int a;/* 只不过在main函数的语句块儿内重新声明了一下a,声明成了(与全局变量a同名的)只具有语句块儿作用域的局部对象,正好将全局变量a覆盖掉了,但是这句话写和没写一个样 */printf("a = %d \n");return 0;
}

静态对象与函数

在文件作用域中声明的对象或函数,并且由static修饰。

静态对象或函数只能在该文件的上下文中可见,不会与其他文件中的对象或函数冲突。

#include <stdio.h>
static int a = 10;
static void fun(void);int main() {return 0;
}static void fun(void) {/* do something */return ;
}

局部对象

声明为函数形参或者在一个语句块儿作用域中(未用static或extern)声明的对象。

局部对象,只要离开了声明它的语句块儿,它就失去了可见性(生命周期结束)。

在古早的C语言中,会使用auto或register声明一个局部变量。但C语言更新迭代到现在,这两个关键字几乎被废弃了。auto会显式地告诉编译器该变量是局部变量,register会建议编译器最好让变量存储在寄存器里(当然C编译器也不一定听从建议~~)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/883380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】【xmake】安装 + C/C++常用项目配置

文章目录 0. 环境准备1. 子命令create - 快速创建项目build - 构建程序config - 配置编译需要的参数show - 查看当前工程基本信息update - 程序自更新 2. C/C 项目常用配置2.1 项目目标类型2.2 添加宏定义2.3 头文件路径和链接库配置2.4 设置语言标准2.5 设置编译优化2.6 添加源…

光伏MPPT追踪的仿真设计

利用Simulink可实现如下功能&#xff1a;改变光照时有MPPT追踪并低电压穿越的能力。 MPPT控制器的全称为“最大功率点跟踪”&#xff08;Maximum Power Point Tracking&#xff09;太阳能控制器&#xff0c;检测主回路直流电压及输出电流&#xff0c;计算出太阳能阵列的输出功…

5.15 加载内核映像文件(1)

首先是 连接脚本与 实际的内核映像大小的关系&#xff1a; 关于ELF 格式的了解&#xff1a; 如何通过 ELF 头&#xff0c; 找到各个段。 网上的关于elf 的截图&#xff1a; 那么 segment 与 section 有什么区别呢&#xff1f; 也就是说&#xff0c; section值得是 单个C文件的…

021、深入解析前端请求拦截器

目录 深入解析前端请求拦截器&#xff1a; 1. 引言 2. 核心实现与基础概念 2.1 基础拦截器实现 2.2 响应拦截器配置 3. 实际应用场景 3.1 完整的用户认证系统 3.2 文件上传系统 3.3 API请求缓存系统 3.4 请求重试机制 3.5 国际化处理 4. 性能优化实践 4.1 请求合并…

安全知识见闻-脚本语言对与安全的重要性

脚本语言 脚本语言的安全性 编写恶意软件的要求 一、部分脚本语言的类型 二、宏病毒&#xff08;Macro Virus&#xff09; 1.编写宏病毒的要求 三、批处理文件&#xff08;bat&#xff09;和PowerShell 1. 批处理文件&#xff08;.bat&#xff09; 1.1. 什么是批处理文…

VisionPro - 高级 - 保存模式以备后用 - 中心圆的查找配置

前言: 在基础篇, VisionPro Basic - 01- 有关应用和作业-CSDN博客 我们提到了应用和作业的保存,那么这些都是vpp的保存格式。 我们知道,在模式工具的配置中,如果我们做好了很多的调试,最后配置好参数后,也有一个保存模式的选项。我们在保存的时候,一定要添加前缀或…

Junit5中用Excel进行数据驱动

在上一篇博文《Junit5中实现参数化测试》中,我们提到过,Junit5能够使用CsvFileSource参数源来实现外部数据的引入并作为参数传递给测试方法。 但实际应用中我们经常使用excel文件来保存测试数据或进行数据驱动。 今天就介绍下如何通过junit5的参数化方法,来支持Excel文件的…

GIT使用list

清空当前commit区 方法 1&#xff1a;软重置到初始状态 如果希望保留文件内容&#xff0c;但清空所有 commit 历史&#xff0c;可以使用以下命令&#xff1a; git reset --soft $(git rev-list --max-parents0 HEAD)解释&#xff1a; --soft 表示重置 commit 历史&#xff…

【机器学习】任务九:卷积神经网络(基于 Cifar-10 数据集的彩色图像识别分类、基于 CNN 的手写数字识别的实验)

1.卷积神经网络 卷积神经网络&#xff08;Convolutional Neural Network, CNN&#xff09;是一种专门用于处理数据网格结构&#xff08;如图像、视频等&#xff09;的深度学习模型&#xff0c;在计算机视觉任务中被广泛应用&#xff0c;如图像分类、目标检测、图像分割等。以下…

[手机Linux PostmarketOS]七, Linux使用selenium爬虫

一&#xff0c;selenium安装 # 用pip 安装 selenium pip3 install selenium --break-system-packages 二&#xff0c;安装浏览器Chrome Alpine Linux 环境中没有google Chrome&#xff0c; 使用 Chromium 浏览器作为 Chrome 的替代品&#xff0c;Chromium 是 Chrome 的开源版本…

在GeoTools中的Shapefile属性表读取效率之Shp与Dbf对比

目录 前言 一、POI测试数据简介 1、选用的POI数据 2、关于数据的属性数据 二、属性数据读取的两种方式实现 1、基于DbaseFileReader的读取 2、基于SimpleFeatureSource的读取 三、实际运行对比 1、内存和CPU占用情况 2、运行耗时情况 四、总结 前言 众所周知&#x…

【C++/Qt 高精度计算qreal temp = static_cast<qreal>(nwidth) / nImgWidth;】

这行代码是C中使用Qt框架时的一个类型转换示例。下面是对这行代码的详细解释&#xff1a; 代码解释 qreal temp1 static_cast<qreal>(nwidth) / nImgWidth;qreal: qreal是Qt框架中定义的一个类型&#xff0c;通常用于表示浮点数。它实际上是float或double的别名&#…

github上传文件代码以及其它github代码

echo "# booksystem2" >> README.md git init git add README.md(此段省略) $ git add . //加的 git commit -m "first commit" git branch -M main git remote add origin gitgithub.com:yuyyyyyydek/booksystem2.git git push -u origin main …

MoonBit 双周报 Vol.58:原生后端支持、多行字符串插值、json.inspect 功能等多项关键特性取得显著进展!

MoonBit支持native后端 Wasm-gc 后端支持 Js-string-builtins proposal 当通过编译选项 -use-js-builtin-string 开启使用 Js-string-builtins 之后&#xff0c;Moonbit 面向 wasm-gc 后端时&#xff0c;会使用 JavaScript 中的字符串类型表示 MoonBit 中的字符串&#xff0…

Unity3D 开发技巧

视频教程&#xff1a; Unity3D 开发技巧分享&#xff0c;你可能不知道的小知识 Unity中文课堂教程地址&#xff1a; Unity3D开发-你可能不知道的知识 | Unity 中文课堂 Start 函数可以用协程 默认协同函数 Start 可将 void 改为IEnumerator 作为协程启动 using System.Colle…

多层感知机的从零实现与softmax的从零实现(真·0000零基础)

今天再读zh.d2l书&#xff08;4.2. 多层感知机的从零开始实现 — 动手学深度学习 2.0.0 documentation&#xff09;&#xff0c; 看了关于多层感知机的从零实现与softmax的从零实现 目录 mlp从零实现&#xff0c; 点击“paddle”的代码 点击“torch”的代码 训练 参数解…

网络爬虫-Python网络爬虫和C#网络爬虫

爬虫是一种从互联网抓取数据信息的自动化程序&#xff0c;通过 HTTP 协议向网站发送请求&#xff0c;获取网页内容&#xff0c;并通过分析网页内容来抓取和存储网页数据。爬虫可以在抓取过程中进行各种异常处理、错误重试等操作&#xff0c;确保爬取持续高效地运行 1、Python网…

DataSophon集成ApacheImpala的过程

注意: 本次安装操作系统环境为Anolis8.9(Centos7和Centos8应该也一样) DataSophon版本为DDP-1.2.1 整合的安装包我放网盘了: 通过网盘分享的文件&#xff1a;impala-4.4.1.tar.gz等2个文件 链接: https://pan.baidu.com/s/18KfkO_BEFa5gVcc16I-Yew?pwdza4k 提取码: za4k 1…

C#与C++交互开发系列(十二):托管和非托管内存管理策略

前言 在进行C#与C互操作开发时&#xff0c;内存管理是一个非常重要的环节。由于C#采用托管内存管理&#xff08;由垃圾回收机制GC控制&#xff09;&#xff0c;而C则使用手动内存管理&#xff08;需要开发者负责分配和释放内存&#xff09;&#xff0c;因此跨语言调用时&#…

光耦的应用

什么是光耦 光耦是一种实现信号隔离的元器件&#xff0c;通常用于各部分电路之间&#xff0c;使其不互相受到影响。 工作原理 光耦是由一个发光二极管和一个光敏三极管封装而成的。其使用原理为&#xff1a; 当发光二极管有信号输入时&#xff0c;则会被点亮&#xff0c;此时…