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

C语言面试之旅:掌握基础,探索深度(面试实战之c语言关键词中篇)

         劝人的话就像清晨的闹钟,只对别人有用,却永远叫不醒自己。

                                                                                                                                          ----小新

一.预处理指令

(1)#define & typedef     

        #define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。

        typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。

例如:

#define PI 3.14159
typedef struct {  char name[50];  int age;  
} Student; 

注解:

        PI就被定义为一个常量,值为3.14159。

(2) #include

   这是预处理指令中最常用的函数之一,用于包含其他文件。

例如:

#include <stdio.h>

注解:

        这个指令就会包含标准输入输出库。


(3)#if#ifdef#ifndef#else#elif#endif

   这些是条件编译的预处理指令,用于有条件地编译程序。

例如:

#if defined(DEBUG) 
// 只有在定义了DEBUG时才会编译这部分代码 
#endif

(4)#undef

    这个预处理指令用于取消已经定义的宏。

例如:

#define PI 3.14159 
#undef PI

注解:

        PI就被取消定义了。


(5) #line#error#pragma

    这些是比较特殊的预处理指令,#line用于改变编译器中的行号和文件名跟踪,#error用于让编译器生成错误信息,#pragma用于实现一些特定的编译器特性。这些指令的使用往往依赖于具体的编译器实现。

(6)__DATE____TIME____FILE____LINE____func__

         这些是C99引入的预定义的宏,分别代表当前日期、时间、源文件名、行号和函数名。例如,__LINE__就会在编译时被替换为当前源代码行号。

(7)__attribute__((...))

        这个是在GCC和一些其他C编译器中使用的特性,用于设置函数属性、变量属性等。例如,__attribute__((noreturn))就表示这个函数不会返回。

二.寄存器存储

(1) register

        1.建议寄存器存储

        通过使用 register 关键字,程序员可以向编译器建议将某个变量存储在寄存器中。寄存器是位于中央处理单元(CPU)内部的存储区域,它的访问速度比内存要快得多。因此,将变量存储在寄存器中可以提高程序的执行速度。

register int counter; // 建议编译器将 counter 存储在寄存器中

        2.编译器决定

        需要强调的是,register 只是一个建议,而非强制要求。编译器可以选择是否将变量存储在寄存器中。通常,编译器会根据代码的复杂性和寄存器的可用性来决定是否采纳这些建议。

        3.限制使用

        register 变量通常有一些限制,例如不能取地址或使用指针对其进行操作,因为寄存器变量不在内存中有地址。这也意味着 register 变量通常不能用于需要取地址的操作,如指针和数组的地址计算。

        4.性能提升

        使用 register 可以提高程序的性能,特别是在循环中对频繁访问的变量使用 register 可能会产生显著的性能提升。

 

三.共享全局变量

1.变量声明

        通过使用 extern,你可以在一个源文件中声明一个在另一个源文件中定义的全局变量,以便在当前源文件中使用它,而不需要重新定义。这对于在多个文件中共享全局变量非常有用。

// File1.c
int globalVar; // 定义全局变量// File2.c
extern int globalVar; // 声明在其他文件中定义的全局变量

2.函数声明

        类似于变量,你也可以使用 extern 来声明在其他源文件中定义的函数。这允许你在当前文件中使用这些函数而无需重新定义它们。

// File1.c
void someFunction(); // 定义函数
// File2.c
extern void someFunction(); // 声明在其他文件中定义的函数

3.解决多文件编程

        extern 用于多文件编程中,特别是当你将程序拆分成多个源文件时,有助于确保这些文件之间的全局变量和函数能够正确共享。它允许你在一个文件中定义,而在其他文件中声明和使用这些全局实体。

4.避免重复定义

        extern 声明允许你在一个文件中定义全局变量或函数,而在其他文件中声明,从而避免多次定义相同的变量或函数,这将导致链接错误。

 

相关文章:

C语言面试之旅:掌握基础,探索深度(面试实战之c语言关键词中篇)

劝人的话就像清晨的闹钟&#xff0c;只对别人有用&#xff0c;却永远叫不醒自己。 ----小新 一.预处理指令 &#xff08;1&#xff09;#define & typedef #define是C语言中定义的语法&#xff0c;是预处理指令&#xff0c;在预处理时进行简单而机械的字符串替换&…...

项目监控:项目跟踪和控制的工具和步骤

项目管理不仅仅是分配和审查任务&#xff0c;还包括平衡团队成员的工作量、创建预测和避免障碍的工作流程。整个过程涉及许多步骤&#xff0c;因此&#xff0c;项目监控成为了成功业务活动的关键之一&#xff0c;是项目经理确保与团队共同实施的计划顺利进行的方式。 项目监控为…...

GOAT:多模态、终身学习、平台无关的机器人通用导航系统

机器人应用中涉及到的核心技术包括&#xff1a;环境感知与理解、实时定位与建图、路径规划、行为控制等。GOAT通过多模态结合终生学习的方式让你的机器人可以在未知环境中搜索和导航到任何物体。小白也可以零门槛上手。 项目地址&#xff1a;https://theophilegervet.github.i…...

[webpack] webpack 插件大全

clean-webpack-plugin 一个webpack插件&#xff0c;用来删除/清理你的构建文件夹 html-webpack-plugin 该插件将为你生成一个 HTML5 文件&#xff0c; 在 body 中使用 script 标签引入你所有 webpack 生成的 bundle js 文件 zip-webpack-plugin 该插件用来压缩所有文件成一…...

UE4/UE5 雾

雾 UE4/UE5 雾平面雾材质效果图&#xff1a; 3D雾区材质效果图&#xff1a; UE4/UE5 雾 平面雾 做好将材质放在Plane上就行 材质 效果图&#xff1a; 3D雾区 做好将材质放在3D模型上就行 材质 效果图&#xff1a;...

Linux处理文件常见命令

目录 1 cp 2 rm 3 zip与unzip 3.1 zip 3.2 unzip 4 cd 5 ls 6 chmod 7 scp 7.1 文件在你操作的机器上&#xff0c;你要传给另一个机器 7.1.1 文件 7.1.2 文件夹 7.2 文件在另一个机器上&#xff0c;你要把文件搞到你操作的机器上 7.2.1 文件 7.2.…...

sed应用

一.sed 1.Sed概述 sed编辑器是一种流编辑器&#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 sed编辑器可以根据命令来处理数据流中的数据&#xff0c;这些命令要么从命令行中输入&#xff0c;要存储在一个命令文本文件中。 2.sed命令的格…...

Linux配置SFTP用户的详细过程

0. 背景 Linux机器上已有路径/data/tomcat/apache-tomcat-8.5.96/webapps/webroot,需要在该路径之下配置一个目录对外暴露给业务人员使用。业务人员使用sftp协议上传文件。 下面是相关配置&#xff1a; SFTP 用户名&#xff1a;iios SFTP主目录&#xff1a;/data/tomcat/apa…...

前端---JavaScript篇

1. 介绍 JavaScript 是 前端开发人员必须学习的 3 门语言中的一门&#xff1a; HTML 定义了网页的内容CSS 描述了网页的布局JavaScript 控制了网页的行为 接下来开始详解JavaScript。 2.引入方法 js有两种导入方式&#xff0c;一种是内部脚本&#xff1a;直接在html页面中…...

使用vue-admin-template时,需要注意的问题,包括一定要去除mock.js注释

在使用vue-admin-template等前端框架时&#xff0c;如果你没有打算用他们的mock数据&#xff0c;在生产环境下一定要注释mock引用的代码&#xff0c;虽然它没有被调用&#xff0c;但是如果你不注释&#xff0c;就会被打包进去。 找到main.js&#xff0c;看如下代码&#xff1a…...

力扣hot100 最大子数组和 动态规划 分治 无后效性 子问题划分

&#x1f468;‍&#x1f3eb; 题目地址 无后效性 为了保证计算子问题能够按照顺序、不重复地进行&#xff0c;动态规划要求已经求解的子问题不受后续阶段的影响。这个条件也被叫做「无后效性」。换言之&#xff0c;动态规划对状态空间的遍历构成一张有向无环图&#xff0c;遍…...

C语言--每日选择题--Day28

第一题 1. 设a和b均为double型变量&#xff0c;且a5.5、b2.5&#xff0c;则表达式(int)ab/b的值是&#xff08; &#xff09; A&#xff1a;6.500000 B&#xff1a;6 C&#xff1a;5.500000 D&#xff1a;6.000000 答案及解析 D 本题考查的是不同数据类型之间的变量进行运算时…...

Linux 安装 Minio 配置 HTTPS

安装 创建目录 [roott2 local]# mkdir minio [roott2 local]# cd minio [roott2 minio]# mkdir data下载 [roott2 minio]# wget https://dl.min.io/server/minio/release/linux-amd64/minio [roott2 minio]# chmod x minio # 赋权设置账号密码 minio 默认账号密码为 minio…...

xcode opencv

1、导入报错 Undefined symbols: linker command failed with exit code 1 (use -v to see invocation) 直接添加如下图内容即可...

Spark---资源、任务调度

一、Spark资源调度源码 1、Spark资源调度源码过程 Spark资源调度源码是在Driver启动之后注册Application完成后开始的。Spark资源调度主要就是Spark集群如何给当前提交的Spark application在Worker资源节点上划分资源。Spark资源调度源码在Master.scala类中的schedule()中进行…...

单片机开发常见问题集合

文章目录 发送串口数据偶尔丢失字节 发送串口数据偶尔丢失字节 场景&#xff1a; 在STM32单片机中进行串口数据发送&#xff0c;在Linux/Windows上进行串口数据接收&#xff0c;会偶发出现接收到的数据有某些字节丢失。 分析&#xff1a; 在STM32中可以使用printf用于发送串口…...

Matlab 点云曲率计算(之二)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 之前已经讨论过许多关于计算曲率的问题,这里使用一个通过拟合三次曲面方程的方式来计算曲率,计算过程如下图所示: 二、实现代码 %********...

C++11的原子变量

C11提供了一个原子类型std::atomic<T>&#xff0c;可以使用任意类型作为模板参数&#xff0c;C11内置了整型的原子变量&#xff0c;可以更方便的使用原子变量&#xff0c;使用原子变量就不需要使用互斥量来保护该变量了&#xff0c;用起来更简洁。例如&#xff0c;要做一…...

北京交通大学 计算机网络体系与协议(研) 考试试卷

计算机网络体系与协议2023年期末考试 时长&#xff1a;120分钟 学院&#xff1a; 学号&#xff1a; 姓名&#xff1a; 一、简答题&#xff08;每题5分&#xff09; 1.简述公开密钥密码体制的工作原理…...

python之pyqt专栏7-信号与槽3

在上一篇文章中python之pyqt专栏6-信号与槽2-CSDN博客中&#xff0c;我们可以了解到对象可以使用内置信号&#xff0c;这些信号来自于类定义或者继承过来的。我们可以对这些信号可以通过connect连接槽函数。 需求 现在有一个需求&#xff0c;有两个UI界面“untitled.ui”和“u…...

免费Windows风扇控制神器:FanControl完全掌控你的电脑散热

免费Windows风扇控制神器&#xff1a;FanControl完全掌控你的电脑散热 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trendin…...

cve_2018_16509(ghostscript)漏洞复现报告

名称: vulfocus/ghostscript-cve_2018_16509:latest​描述: ​GhostScript 被许多图片处理库所使用&#xff0c;如 ImageMagick、Python PIL 等&#xff0c;默认情况下这些库会根据图片的内容将其分发给不同的处理方法&#xff0c;其中就包括 GhostScript。​在 9.24 之前的 Ar…...

天地图(T=img_w/c)和谷歌地图(lyrs=s/m)的URL参数到底怎么用?一篇讲清所有地图瓦片服务调用细节

天地图与谷歌地图URL参数全解析&#xff1a;从瓦片调用到坐标系实战 当你需要在项目中集成地图服务时&#xff0c;是否曾被各种URL参数搞得一头雾水&#xff1f;Timg_w和Timg_c有什么区别&#xff1f;lyrss和lyrsm又代表什么&#xff1f;本文将彻底拆解两大主流地图服务的URL设…...

如何高效处理生命科学图像数据:Bio-Formats完全实战指南

如何高效处理生命科学图像数据&#xff1a;Bio-Formats完全实战指南 【免费下载链接】bioformats Bio-Formats is a Java library for reading and writing data in life sciences image file formats. It is developed by the Open Microscopy Environment. Bio-Formats is re…...

万事开头难,读懂屯卦的智慧,你就知道创业、求职、成家该怎么走

开头难&#xff0c;不是吓你&#xff0c;是规律你有没有发现&#xff0c;人生最难的事&#xff0c;往往都是“第一次”&#xff1f;第一次创业&#xff0c;第一次找工作&#xff0c;第一次生孩子&#xff0c;第一次写书&#xff0c;第一次开店……每一件事在开始的时候&#xf…...

在线溶解氧分析仪 在线溶氧测定仪 在线溶解氧水温分析仪

在线溶解氧分析仪的精准性与稳定性&#xff0c;源于核心参数的科学配置&#xff0c;每一项参数都贴合实际应用场景&#xff0c;确保监测数据可靠、设备运行稳定&#xff0c;具体核心参数如下&#xff1a;测量参数&#xff1a;核心监测溶解氧、水温&#xff0c;可快速、准确记录…...

Proteus仿真集成:在虚拟硬件环境中测试Qwen3.5-2B边缘AI算法

Proteus仿真集成&#xff1a;在虚拟硬件环境中测试Qwen3.5-2B边缘AI算法 1. 边缘AI开发的痛点与虚拟仿真价值 在嵌入式AI应用开发中&#xff0c;硬件与算法的协同验证一直是个棘手问题。传统开发流程需要先制作硬件原型&#xff0c;再部署算法进行测试&#xff0c;一旦发现问…...

robust互斥锁实现原理(futex内核态源码分析)

由于OOM&#xff0c;avm一直被内核kill -9杀掉。最终会出现avm重启报错 bos_em_service: Fatal glibc error: pthread_mutex_lock.c:450 (__pthread_mutex_lock_full): assertion failed: e ! ESRCH || !robust。这个锁是共享内存上的一个robust互斥锁。 而且该BUG报了好几例。…...

FP6291升压芯片:升压5V/7.4V/12V,适配智能门锁供电需求

在智能门锁硬件设计与实操过程中&#xff0c;常见的痛点是锂电池的常见电压&#xff08;3.7V、3.2V&#xff09;与门锁电机的工作电压需求&#xff08;5V、7.4V、甚至12V&#xff09;不匹配&#xff0c;电压不足直接导致电机无法正常驱动&#xff0c;进而影响门锁开关功能的实现…...

SDMatte Web前端性能优化:大图片上传与预览的流畅体验实现

SDMatte Web前端性能优化&#xff1a;大图片上传与预览的流畅体验实现 1. 引言&#xff1a;大图片处理的用户体验痛点 在图像处理类Web应用中&#xff0c;用户上传大尺寸图片时常常面临几个典型问题&#xff1a;上传速度慢、页面卡顿、预览效果差。以SDMatte这样的智能抠图工…...