【C语言】(8)宏定义

1. 简介

宏定义(#define)是C语言预处理指令的一种,用于为程序中的值或代码片段创建别名。宏定义可以使代码更加简洁、易于维护,并且可以提高代码重用性。

2. 基本用法

定义常量

宏可以用来定义常量,代替硬编码的数字或字符串,使代码更具有可读性。

#define MAX_SIZE 100
#define GREETING "Hello, World!"

示例:

#include <stdio.h>#define MAX_SIZE 100
#define PI 3.14int main() {int numbers[MAX_SIZE]; // 使用宏定义的数组大小printf("%s\n", "Hello, World!"); // 使用宏定义的字符串printf("The value of PI is: %f\n", PI); // 使用宏定义的常量return 0;
}
定义宏函数

宏也可以定义类似函数的代码片段,但它在编译时会被直接替换成相应的代码,而不是执行函数调用。

#define SQUARE(x) ((x) * (x))
#define MIN(a, b) ((a) < (b) ? (a) : (b))

示例:

#include <stdio.h>#define SQUARE(x) ((x) * (x))
#define MIN(a, b) ((a) < (b) ? (a) : (b))int main() {int num = 5;printf("%d 的平方是 %d\n", num, SQUARE(num)); // 输出 25printf("%d 和 %d 相比, %d 更小\n", 10, 5, MIN(10, 5)); // 输出 5return 0;
}

3. 条件编译

宏定义常用于条件编译,控制代码的编译与否。

#define DEBUG#ifdef DEBUGprintf("Debug information\n");
#endif

4. # 和 ##

在C语言中,宏定义提供了两个非常强大的操作符:###。它们在预处理阶段对宏进行操作,使得宏的功能更加灵活和强大。

4.1 字符串化操作符(#

字符串化操作符#,在宏定义中,把参数转换成字符串。当使用#对宏参数进行操作时,预处理器会把这个参数转换为一个字符串字面量。

示例

#define TO_STRING(x) #xint main() {printf("%s\n", TO_STRING(Hello));  // 输出 "Hello"printf("%s\n", TO_STRING(123));    // 输出 "123"
}

在这个例子中,TO_STRING宏会把它的参数转换成一个字符串。无论参数是数字、字符还是标识符,都会变成对应的字符串形式。

4.2 连接操作符(##

连接操作符##用于连接两个宏参数。它可以用来在宏中创建变量名、函数名或者其他标识符。

示例

#include <stdio.h>
#define CONCAT(a, b) a##bint main() {int myVar = 100;int anotherVar = CONCAT(my, Var);  // 连接 my 和 Var,得到 myVarprintf("%d\n", anotherVar);        // 输出 100
}

在这个例子中,CONCAT宏将两个参数myVar连接成一个新的标识符myVar。这使得我们能够在宏中动态地创建和使用变量名。

5. 注意事项

  • 使用宏定义时,要注意括号的使用,特别是在定义宏函数时,以避免运算符优先级引起的错误。
  • 宏定义不进行类型检查,使用时需谨慎。
  • 宏定义会在预处理阶段展开,可能会导致生成的代码量增大。
  • 宏定义中的参数不应该有副作用,例如 #define SQUARE(x) ((x)++ * (x)++) 是不安全的。

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

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

相关文章

MyBatis --- 常用注解

目录 前言 1. Mapper 2. Select 3. Insert 4. Update 5. Delete 6. Results 注意事项&#xff1a; 前言 MyBatis是一款强大的持久层框架&#xff0c;通过注解的方式&#xff0c;可以更便捷地进行数据库操作。本文将介绍MyBatis中常用的注解以及在使用这些注解时需要注意…

uniapp微信小程序-秋云u-charts层级过高

一、先说问题 想在这个每个圆环上面定位一些百分比或者定位一些东西,微信小程序端可以&#xff0c;真机调试不行&#xff0c;打算提高层级不行 二、解决 点击底下开启2d就可以&#xff0c; 也就是在你的图表上加上 :canvas2d"true"

Vue 插槽讲解

什么是插槽&#xff1f; Slot 通俗的理解就是“占坑”&#xff0c;在组件模板中占好了位置&#xff0c;当使用该组件标签时候&#xff0c;组件标签里面的内容就会自动填坑&#xff08;替换组件模板中slot位置&#xff09;并且可以作为承载分发内容的出口。 简单的来说为了更加…

Adobe ColdFusion 任意文件读取漏洞复现(CVE-2023-26361)

0x01 产品简介 Adobe ColdFusion是美国奥多比(Adobe)公司的一套快速应用程序开发平台。该平台包括集成开发环境和脚本语言。 0x02 漏洞概述 Adobe ColdFusion平台 filemanager.cfc接口存在任意文件读取漏洞,攻击者可通过该漏洞读取系统重要文件(如数据库配置文件、系统配…

流畅的Python(六)-使用一等函数实现设计模式

一、核心要义 《设计模式&#xff1a;可复用面向对象软件的基础》一书中有23个设计模式&#xff0c;其中有16个在动态语言中"不见了或者简化了"。作为动态语言之一的Python, 我们可以利用一等函数简化其中的某些设计模式&#xff0c;本章主要介绍如何使用一等函数重…

c++ QT 信号的个人理解 信号就是独立文件调用的一种“协议”

一. 简介 就我个人来理解&#xff0c;信号槽机制与Windows下消息机制类似&#xff0c;消息机制是基于回调函数&#xff0c;Qt中用信号与槽来代替函数指针&#xff0c;使程序更安全简洁。 信号和槽机制是 Qt 的核心机制&#xff0c;可以让编程人员将互不相关的对象绑定在一起&a…

写一段防止sql注入的sql查询

要防止SQL注入攻击&#xff0c;可以使用参数化查询或预编译查询来防止恶意SQL代码的注入。下面是一个使用参数化查询的示例&#xff1a; DECLARE username nvarchar(50) ?; DECLARE password nvarchar(50) ?;SELECT * FROM users WHERE username username AND password …

边缘计算在电力行业的应用:挑战与机遇

摘要&#xff1a; 随着电力行业的数字化转型&#xff0c;边缘计算作为一种新兴技术&#xff0c;正在变得日益重要。通过将数据处理能力带到网络的边缘&#xff0c;即接近数据产生的地方&#xff0c;边缘计算能显著提高电力系统的实时性和效率。然而&#xff0c;这一变革同时带来…

如何用web界面打开华为防火墙

目录 1.创建一个虚拟网卡 2.cloud操作 3.防火墙上操作 4. 登录 1.创建一个虚拟网卡 2.cloud操作 3.防火墙上操作 4. 登录

Elasticsearch 中使用MustNot等同于不登录遇到的坑

1、在写关键词推荐时,需要把当前文章过滤掉,不能再推荐自己的文章,所以再es中需要用到 MustNot属性查询 /// <summary> /// 服务中心es检索 /// </summary> /// <param name="input"></param> /// <returns></…

Netty的解码器和编码器

链路图 一个完整的RPC请求中&#xff0c;netty对请求数据和响应数据的处理流程如下图所示 网络线路中传输的都是二进制数据&#xff0c;之后netty将二进制数据解码乘POJO对象&#xff0c;让客户端或者服务端程序处理。 解码的工具称为解码器&#xff0c;是一个入站处理器InBo…

磁盘数据恢复软件开发计划

无用:pyfilesystem2 :不适合磁盘数据恢复 pip install fs --trusted-host pypi.tuna.tsinghua.edu.cnpyfilesystem2 doc pdf 有用的? 直接python读取磁盘例子 直接python读取磁盘例子 ntfs结构遍历例子: nneonneo/ntfsrecover ntfsrecover.py 没啥用:PabloLec/Reco…

物联网协议Coap之C#基于Mozi的CoapClient调用解析

目录 前言 一、CoapClient相关类介绍 1、CoapClient类图 2、CoapClient的设计与实现 3、SendMessage解析 二、Client调用分析 1、创建CoapClient对象 2、实际发送请求 3、Server端请求响应 4、控制器寻址 总结 前言 在之前的博客内容中&#xff0c;关于在ASP.Net Co…

node.js 分布式锁看这篇就够用了

Redis SETNX 命令背后的原理探究 当然&#xff0c;让我们通过一个简单的例子&#xff0c;使用 Redis CLI&#xff08;命令行界面&#xff09;来模拟获取锁和释放锁的过程。 在此示例中 获取锁: # 首先&#xff0c;设置锁密钥的唯一值和过期时间(秒) 127.0.0.1:6379> SET …

数字三角形(很经典的动态规划问题)

给定一个如下图所示的数字三角形&#xff0c;从顶部出发&#xff0c;在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点&#xff0c;一直走到底层&#xff0c;要求找出一条路径&#xff0c;使路径上的数字的和最大。 73 88 1 02 7 4 4 4 5 2 6 …

OpenCV:绘制图像中mask的最小外接矩形

在计算机视觉和图像处理中&#xff0c;我们经常需要计算直线与外接矩形边的交点。这在进行边缘检测、图像分割、目标跟踪等任务时非常有用。本文将介绍如何使用OpenCV和NumPy计算直线与外接矩形边的交点&#xff0c;并展示如何在实际图像中绘制直线。 1.使用OpenCV读取图像 i…

第2章-神经网络的数学基础——python深度学习

第2章 神经网络的数学基础 2.1 初识神经网络 我们来看一个具体的神经网络示例&#xff0c;使用 Python 的 Keras 库 来学习手写数字分类。 我们这里要解决的问题是&#xff0c; 将手写数字的灰度图像&#xff08;28 像素28 像素&#xff09;划分到 10 个类别 中&#xff08;0…

基于多种CNN模型在清华新闻语料分类效果上的对比

该实验项目目录如图&#xff1a; 1、 模型 1.1. TextCNN # coding: UTF-8 import torch import torch.nn as nn import torch.nn.functional as F import numpy as npclass Config(object):"""配置参数"""def __init__(self, dataset, embedd…

java中如何使用Lambda表达式(一)

什么是Lambda表达式 Lambda 表达式&#xff08;lambda expression&#xff09;是一个匿名函数&#xff0c;基于数学中的λ演算得名&#xff0c;直接对应于其中的lambda抽象&#xff08;lambda abstraction&#xff09;&#xff0c;是一个没有函数名的函数。Lambda表达式可以表…

【C++类与对象(上)】

C类与对象(上&#xff09; 1.面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1 访问限定符4.2 封装 5.类的作用域6.类的实例化7.类的对象大小的计算7.1如何计算类对象的大小7.2 类对象的存储方式猜测7.3结构体内存对齐规则 8.类成员函数的this指针8.1…