C语言学习笔记九(宏定义)

c语言学习笔记 以上是一份 C 语言学习笔记的简要内容,C 语言还有很多其他的特性和高级用法,需要通过不断的学习和实践来掌握。 阅读详情

1.预处理的概念

        预处理的编译就是对C语言的源程序进行编译前,有“编译预处理程序”对预处理命令进行处理的过程。

        C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。

2. 宏定义的基本概念

 宏定义是C语言预处理指令之一,使用#define指令实现,用于在编译前进行文本替换。

基本语法

#define 宏名 替换文本

 示例

#define PI 3.1415926
#define MAX_SIZE 100

3. 宏定义的分类

3.1 无参宏(对象式宏)

#define BUFFER_SIZE 1024
#define VERSION "1.0.0"

 3.2 带参宏(函数式宏)

#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define SQUARE(x) ((x) * (x))

4. 宏定义的特点

  1. 预处理阶段替换:在编译前进行文本替换

  2. 无类型检查:宏只是简单的文本替换

  3. 不分配内存:宏定义不占用内存空间

  4. 作用域从定义处到文件结束(可用#undef取消定义)

5. 带参宏的注意事项

5.1 参数括号

为避免运算符优先级问题,参数和整个表达式都应加括号:

// 错误的示例
#define SQUARE(x) x * x
// 正确的示例
#define SQUARE(x) ((x) * (x))

5.2 避免副作用

宏参数可能被多次求值,导致副作用:

#define MAX(a, b) ((a) > (b) ? (a) : (b))
int x = 1, y = 2;
int z = MAX(x++, y++); // 可能导致x或y被多次递增

5.3 多行宏定义

使用反斜杠\实现多行宏:

#define SWAP(a, b) do { \
    typeof(a) temp = a; \
    a = b;              \
    b = temp;           \
} while(0)

6. 特殊宏运算符

6.1 字符串化运算符#

将宏参数转换为字符串:

#define STR(x) #x
printf("%s", STR(hello)); // 输出 "hello"

6.2 连接运算符##

连接两个标记:

#define CONCAT(a, b) a##b
int xy = 10;
printf("%d", CONCAT(x, y)); // 输出 xy的值 10

7. 预定义宏

C语言提供了一些预定义宏:

__LINE__    // 当前行号
__FILE__    // 当前文件名
__DATE__    // 编译日期
__TIME__    // 编译时间
__STDC__    // 是否遵循ANSI C标准
__func__    // 当前函数名(C99)

8. 宏与函数的比较

特性宏函数
执行时机预处理阶段运行时
类型检查无有
开销代码膨胀调用开销
调试难以调试易于调试
参数求值可能多次求值只求值一次
适用场景简单操作、常量定义等复杂逻辑、重用代码等

9. 宏的常见用途

  1. 定义常量

  2. 条件编译

  3. 简化复杂表达式

  4. 泛型编程(通过宏模拟)

  5. 调试信息输出

  6. 平台特定代码处理

10. 最佳实践

  1. 宏名全部大写以区分变量和函数

  2. 带参宏的每个参数和整体表达式都要加括号

  3. 避免使用会产生副作用的参数

  4. 复杂逻辑优先考虑使用函数而非宏

  5. 适当使用do {...} while(0)包裹多语句宏

  6. 及时使用#undef取消不再需要的宏定义

C语言学习-小甲鱼(第一天随堂笔记) C语言学习-小甲鱼(第一天随堂笔记) P1第一个程序 编程语言是干啥的? 编程语言是人类跟机器打交道的枢纽,它充当人类的翻译官。 例如莫斯密码 机器语言 汇编语言 C语言 #include<stdio,h> int main() { printf("Hello world!\n"); return 0; } 使用C语言编程 C语言的特点 编译型语言vs解释型语言 体现了效率高 P2打印 打印 向屏幕打印,即为输出。 printf("输出的内容 阅读详情

相关推荐

C语言学习笔记(1)

Q的作用等价于int,重命名的目的是提高代码可读性typedef的可移植性强,可以在前面定义别名的使用,只需要改变一次比如int在桌面端占用4个字节,在嵌入式的时候可能就只有两个字节,只需要把重命名的前面的类型改变,比如嵌入式中int占用2字节,long占用4字节,只需要把int改为long就可以恢复桌面端占用4字节int的效果。//把int重命名为QQ a=0;//a是int类型int arr[4];//声明一个数组//变量名为arr//类型为int[4]10.3常数const。

Apricity_L的博客 888

C语言学习:宏定义#define

宏定义#define

weixin_45783574的博客 5778

【KBrowser】基于 Kiwi/chromium 制作全新外壳,将 chromium 代码当作 webview 使用,实现可控核替换

chromium 其实只需几步巧妙的架构,就能拿来“换核”,甚至可以插件化,实现类似webview.apk 的效果。重新设计界面,不再是差不多的回声。而 Kiwi 基于 chrome 77 ,只有 50 MB。优势是兼容好、可安装扩展。

sinat_27171121的博客 2029

C语言学习笔记

字符型: char 1字节 -- 有符号 -- 数值范围 -128 ~ 127 -- 无符号 -- 数值范围 0 ~ 255短整型:short 2字节 -- 有符号 -- 数值范围 -32768 ~ 32767 无符号 --数值范围 0 ~ 65535整型:int 4字节 -- 有符号 -- 数值范围 --2^31 ~ 2^31 - 1 无符号 --数值范围 0 ~ 2^32 - 1。

qq_62758611的博客 1891

《生化危机9:安魂曲》D加密免BIOS破解方案详解

数字版权管理(DRM)技术通过加密手段保护软件版权,Denuvo(D加密)作为主流方案常应用于3A游戏。其原理是通过实时验证机制阻止未授权访问,但可能影响性能表现。本文以《生化危机9》为例,解析一种免BIOS修改的D加密绕过方案,该方案通过授权启动器模拟正版验证流程,保持系统零侵入性。实测表明,该方法在GTX 1060至RTX 3070等多硬件平台均能稳定运行,支持MOD扩展且兼容Reshade画质增强,为玩家提供开箱即用的绿色版体验。

weixin_33898233的博客 925

Windows 下 Claude Code Desktop 安装与使用全记录:从零到一的保姆级图文教程

本文主要介绍了Windows 下 Claude Code 安装全记录:从零到一的保姆级图文教程,希望能对学习使用 Claude Code 的同学们有所帮助。 文章目录 1. 背景 2. 安装Claude Code Desktop 3. 配置第三方API 4. 日常使用

weixin_43178406的博客 8万+

C语言学习笔记 宏定义

C语言允许带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,再调用中,不仅要宏展开,而且要用实参去代换形参。带参宏定义的一般形式为: #define 宏名(形参表) 字符串带参宏调用的一般形式为:宏名(实参表)a:b1.带参宏定义中,宏名和形参表之间不能有空格出现。a:b //错误示范出现空格时,编译器会报错。2.在带参宏中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体的值。要用他们去代换形参,因此必须作类型说明。

qq_66249412的博客 1737

PON架构(全光网络)

目前组网架构世界上有一种最快的速度又是光,以前传统以太网络规划满足不了现在的需求。有线网 无线网 全光网络方案场景 全光网络分类 以太全光网络 PON(Pas-sive-Optical Network 无源光网络) 再典型的中大型高校网络中 推荐万兆入室 千兆到桌面的带宽设计 一般三层 (终端-接入层-汇聚层-核心层-出口(安全设备)-互联网) 单校区核心设备 一般采用两台高性能的核心交换机 双机的方式采用的是 M-LAG 多校区之间核心交换机采用1

qq_56248592的博客 6269

C语言学习笔记——宏定义

宏定义 #define 叫做宏定义命令,它也是C语言预处理命令的一种。所谓宏定义,就是用一个标识符来表示一个字符串,如果在后面的代码中出现了该标识符,那么就全部替换成指定的字符串。宏定义是由源程序中的宏定义命令#define完成的,宏替换是由预处理程序完成的。 宏定义的一般形式 #define 宏名 字符串 #表示这是一条预处理命令,所有的预处理命令都以 # 开头。宏名是标识符的一种,命名规...

火山宝 && 王林宝 1695

RT-DETR升级:TGRS2026 CKConv结合RepC3 | 方向特征与跨阶段融合协同,小目标漏检率大幅下降

小目标鲁棒性提升:CKConv方向选择性抑制背景噪声,RepC3跨阶段传递保留深层微弱热信号,显著改善低对比度、低信噪比场景下的检测精度。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 151

mjlab MuJoCo 人形机器人强化学习入门教程(一)安装配置使用

mjlab是融合IsaacLab API与MuJoCo物理引擎的强化学习工具,提供轻量级GPU加速仿真方案。当前处于测试阶段,支持Linux系统(推荐)和有限macOS支持。核心优势包括:1)直接集成MuJoCo Warp实现裸机性能;2)保留IsaacLab成熟的RL抽象层;3)简化安装流程。与IsaacLab相比更专注于MuJoCo生态,适合刚体机器人RL研究。文档包含详细安装指南、平台兼容性说明、与IsaacLab的API差异对比及常见问题解答。项目正在积极开发中,欢迎社区贡献和反馈。

2506_90492529的博客 1998

C语言学习——预处理命令(宏定义)

用一个指定的标识符(即名字)来代表一个字符串,它的一般形式为#define 标识符 字符串它的作用是在本程序文件中用指定的标识符PI带代替“3.1415926”这个字符串,在编译预处理时,将程序中在该命令以后出现的所有PI都用"3.1415926"代替。这种方法能以一个简单的名字代替一个长的字符串,因此把这个标识符(名字)称为“宏名”,在预编译时将宏名替换成字符串的过程称为“宏展开”。#define是宏定义命令。使用不带参数的宏定义。

weixin_63292027的博客 1463

ADBC 全面解析:ABAP 开发者玩转 Native SQL 的实战指南

本文介绍了 SAP ABAP 中的 ADBC(ABAP Database Connectivity)技术,它是一种基于 ABAP 面向对象的类库,用于访问 Native SQL 接口。与 Open SQL 和 EXEC SQL 相比,ADBC 具有以下优势:支持特定数据库语法、可访问二级数据库连接、执行多种 SQL 操作且语法更 ABAP 化。文章通过示例展示了 ADBC 的基本用法,包括创建语句对象、执行查询和处理结果集。建议在需要数据库特有功能或二级连接时优先使用 ADBC,同时提供封装类来简化调用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 308

c语言学习(宏定义)

常见的宏定义有两种,不带参数的宏定义和带参数的宏定义 一,不带参数的宏定义(所谓的标识符常量) 格式 #define 宏名 字符串 功能:在编程时,可以用宏名代表相应的字符串,在预处理时,程序中的宏名将会被自动替换成相应的字符串。(宏定义是比较常用的预处理指令,即使用“标识符”来表示“替换列表”中的内容。标识符称为宏名,在预处理过程中,预处理器会把源程序中所有宏名,替换成宏定义中替换列表中的内容。) 说明: 1,宏名遵循标识符命名规则,通常为大写 2,字符串不带双引号 3,末尾不带分号,如果带

封茗世香 3349

[系统安全] 四十七.恶意软件分析 (3)动态分析经典沙箱Cape的安装和基础用法详解

系统安全将更好地帮助初学者了解病毒逆向分析和系统安全。前文详细介绍恶意代码静态分析经典工具Capa的基础用法,以及批量提取静态特征和ATT&CK技战术,主要是从提取的静态特征Json文件中提取关键特征。这篇文章将详细讲解动态分析沙箱Cape,其是一个开源的自动恶意软件分析系统,通过自动运行和分析恶意软件,全面分析和提取恶意软件的关键特征。本文先介绍Cape沙箱的安装和基础用法,后续随着深入再分享。基础性文章,希望对您有帮助!

杨秀璋的专栏 6737

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【C语言学习笔记】七、宏定义、内联函数

上面的程序,就是要循环10次,每次循环都要调用一次square函数。这和函数的参数类似,但又不一样。而函数的参数则是不同,函数的形参和实参是2个不同的变量,它们是通过栈进行传输的;非也,内联函数虽然节省了函数调用的时间消耗,但由于每一个函数出现的地方都要进行替换,因此增加了代码编译的时间。使用关键字inline,也就是使用内联函数,就不会频繁的申请栈空间,代码不会频繁的跳来跳去的去执行。比如,square函数是内嵌到main函数中,不会执行着main函数,又要调用square函数,再跳到square函数。

因为热爱所以坚持 875

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C 语言学习笔记(预处理和库文件)

预处理就是在源文件(.c文件)编译之前,所进行的一部分预备操作,这部分操作是由预处理器(预处理程序)自动完成。当源文件在编译时,编译器会自动调用预处理程序来完成预处理执行的操作,预处理执行解析完成才能进入下一步的编译过程。gcc 源文件 - E - o 程序名语法#define 宏名称 宏值# define 宏名称 宏值(替换文本)# define 宏名称 宏值(替换文本)预处理机制:此时的预处理只做数据的替换,不做类型检查注意:宏定义不会占用内存空间,因为在编译前已经将宏名称替换成了宏值宏展开。

m0_53459880的博客 1616

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【C语言学习】宏定义大揭秘:C语言中的预处理器魔法,你get到了几个技巧?

在C语言编程中,预处理器是一个强大的工具,可以在编译之前对源代码进行一系列的文本替换和处理。其中,宏定义是最常用的功能之一。通过宏定义,我们可以简化代码、提高可读性和维护性。今天,我们就来揭开宏定义的神秘面纱,带你一步步走进这个充满魔力的世界。准备好了吗?让我们开始吧!宏定义是一种在编译前对源代码进行文本替换的技术。C语言中的宏定义通常使用#define指令来实现。宏定义可以分为两种类型:对象宏和函数宏。宏定义虽然强大,但也有一些需要注意的地方。下面通过一些具体的例子来说明宏定义的使用技巧。

java专栏 2015

C语言学习(十七)全局变量 宏定义

1.全局变量 ①全局变量的定义与性质 定义在函数外面的变量是全局变量,全局变量具有全局的生存期和作用域,它们与任何函数都无关,在任何函数内部都可以使用它们。 例1:全局变量 #include&lt;stdio.h&gt; int f(void); int g=12; //定义全局变量 int main(int argc, char const *argv[]) { printf(...

pan的博客 7077

c语言学习笔记之宏定义

1、宏名的命名规范: 全部大写有多个单词中间使用下划线隔开(常用) 以k开头的驼峰标识(不常用) 2、程序运行过程源代码 -》编译预处理 ——》 编译 -》链接 -》 运行3、编译预处理指令:在编译前进行解析处理的指令编译预处理指令包括:1. 宏定义 #define 1.1 不带参数宏定义 1.2 带参数的宏定义 2. 条件编译 3. 文件包含 #include 编译预处理指令:

csdn1571167656的博客 542

计算机二级C语言学习笔记(四)

上一篇:2019年计算机二级C语言学习笔记(三) 考点18:局部变量和全局变量 1.register变量的值放在寄存器内而不是放在内存中,所以register变量没有地址,也就不能对它进行求地址运算 2.全局变量和某函数中的局部变量同名,全局变量被屏蔽在该函数内,访问的是局部变量,与同名全局变量不发生任何关系 3.全局变量生存期是整个程序的运行期间 4.在一个C源程序文件中所定义的全局变量其作用域...

LinGavinQ 2088

C语言学习笔记--C语言中的宏定义

1. C 语言中的宏定义 (1)#define 是预处理器处理的单元实体之一(因此,预处理器只是简单的进行替换,并不(2)#define 定义的宏可以出现在程序的任意位置(包括函数体的内部)(3)#define 定义之后的代码都可以使用这个宏 2. 定义宏常量 (1)#define 定义的宏常量可以直接使用(2)#define 定义的宏常量本质为字面量 3. 宏定义表达式 ...

adl30141的博客 353

C语言学习 动态申请--宏定义--结构体

C语言学习 动态申请--宏定义--结构体

weixin_58037275的博客 1143

C语言学习笔记——预处理命令

1.预处理命令的基本介绍 2.预处理命令代码示例 3.C语言宏定义 4.宏定义的形式 5.带参数的宏定义、宏定义和函数的区别

JiangNan_1002的博客 1674
上一篇: C语言学习笔记八(结构体)
下一篇: C语言:实现两个整数交换的所有方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SegmentFault 咖啡馆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值