C语言练习百题之宏#define命令
宏(Macro)是C语言中的一种预处理指令,它使用#define命令定义符号常量、宏函数和代码片段。下面列举了各种宏的应用场景以及相关注意事项:
-
定义常量:
#define PI 3.14159265- 注意事项:使用宏定义常量可以提高代码的可读性,但要确保不会与其他定义冲突,并使用大写字母表示。
-
宏函数:
#define SQUARE(x) ((x) * (x))- 注意事项:宏函数通常用于简单的替换操作,但要小心参数的求值次数和副作用。最好用括号包围参数以防止预期外的行为。
-
条件编译:
#define DEBUG 1 #if DEBUG// Debug-specific code #endif- 注意事项:宏常用于条件编译,以在不同的编译配置下启用或禁用代码块。
-
字符串拼接:
#define CONCAT(a, b) a ## b- 注意事项:
##运算符用于将标识符拼接在一起,但要确保它们可以正确连接。
- 注意事项:
-
变参宏:
#define PRINTF(format, ...) printf(format, ##__VA_ARGS__)- 注意事项:变参宏允许函数接受可变数量的参数,但要小心参数的数量和类型,以及在调用时使用合适的格式控制。
-
条件宏定义:
#ifndef MY_MACRO #define MY_MACRO #endif- 注意事项:条件宏定义用于避免多次包含头文件,确保头文件只被包含一次。
-
宏嵌套:
#define MAX(a, b) ((a) > (b) ? (a) : (b)) #define SQUARE_MAX(x, y) SQUARE(MAX(x, y))- 注意事项:宏可以嵌套,但要确保嵌套不会导致不必要的复杂性。
-
位操作宏:
#define SET_BIT(reg, bit) ((reg) |= (1 << (bit))) #define CLEAR_BIT(reg, bit) ((reg) &= ~(1 << (bit)))- 注意事项:位操作宏用于设置和清除位,但要小心位偏移和数据类型。
-
代码片段:
#define BEGIN { #define END }- 注意事项:宏可以用于定义代码片段,但要小心代码的可读性和维护性。
-
宏的作用域:
- 注意事项:宏的作用域通常在定义它的文件中,不会跨越不同的源文件。
总之,宏是C语言中非常强大的工具,但也需要小心使用。要确保宏的命名规范、参数传递方式以及嵌套等方面是合理的,以避免不必要的错误和混淆。此外,宏定义的可维护性和可读性是很重要的,因此要保持它们的简洁性和清晰性。
当涉及更复杂的宏的应用场景时,你可以考虑以下情况:
- 泛型编程:使用宏实现泛型数据结构或算法。例如,你可以使用宏定义通用的数据结构,如通用队列或通用哈希表,以便在不同的项目中重复使用。
#define DEFINE_QUEUE(type) \
struct type##_queue { \type *buffer; \int size; \int front; \int rear; \
};DEFINE_QUEUE(int)
DEFINE_QUEUE(char)
- 日志记录:使用宏来实现灵活的日志记录,以便在不同的编译配置下调整详细程度或输出目标。
#define LOG_DEBUG(msg, ...) fprintf(stderr, "DEBUG: " msg "\n", ##__VA_ARGS__)
#define LOG_ERROR(msg, ...) fprintf(stderr, "ERROR: " msg "\n", ##__VA_ARGS__)
- 编码宏:编写宏来自动生成重复的代码或数据结构。例如,你可以编写一个宏,根据数据结构的描述来生成序列化和反序列化函数。
#define SERIALIZE(type, field) \
void serialize_##type(type data, FILE *file) { \fwrite(&data.field, sizeof(data.field), 1, file); \
}SERIALIZE(Person, age)
SERIALIZE(Person, name)
- 断言宏:创建自定义的断言宏,以提供更丰富的错误信息和跟踪。
#define CUSTOM_ASSERT(condition, message) \
do { \if (!(condition)) { \fprintf(stderr, "Assertion failed: %s, File: %s, Line: %d\n", message, __FILE__, __LINE__); \exit(1); \} \
} while (0)
- 日志级别控制:使用宏来控制日志记录的级别,以便根据需要启用或禁用不同级别的日志。
#define LOG(level, msg, ...) \
if (level <= LOG_LEVEL) { \fprintf(stderr, msg, ##__VA_ARGS__); \
}#define LOG_LEVEL 2
- 单元测试框架:创建自己的单元测试框架,使用宏来定义测试用例和断言。
#define TEST_CASE(name) \
void test_##name()#define ASSERT(condition) \
do { \if (!(condition)) { \fprintf(stderr, "Assertion failed: %s, File: %s, Line: %d\n", #condition, __FILE__, __LINE__); \exit(1); \} \
} while (0)
这些是更复杂的宏应用场景示例,它们可以提高代码的可维护性、复用性和灵活性,但也需要小心维护和调试,以确保其正确性。不正确的宏使用可能导致代码难以理解和维护。
相关文章:
C语言练习百题之宏#define命令
宏(Macro)是C语言中的一种预处理指令,它使用#define命令定义符号常量、宏函数和代码片段。下面列举了各种宏的应用场景以及相关注意事项: 定义常量: #define PI 3.14159265注意事项:使用宏定义常量可以提高…...
阿里云存储I/O性能、IOPS和吞吐量是什么意思?
云盘的存储I/O性能是什么?存储I/O性能又称存储读写性能,指不同阿里云服务器ECS实例规格挂载云盘时,可以达到的性能表现,包括IOPS和吞吐量。阿里云百科网aliyunbaike.com分享阿里云服务器云盘(系统盘或数据盘࿰…...
Linux知识点 -- 网络基础 -- 数据链路层
Linux知识点 – 网络基础 – 数据链路层 文章目录 Linux知识点 -- 网络基础 -- 数据链路层一、数据链路层1.以太网2.以太网帧格式3.重谈局域网原理4.MAC地址5.MTU6.查看硬件地址和MTU的命令7.ARP协议 二、其他重要协议或技术1.DNS(Domain Name System)2.…...
git服务器宕机后,怎么用本地仓库重新建立gitlab服务器(包括所有历史版本)
一、重新建立 当您的 GitLab 服务器因为某种原因宕机后,您可以使用本地仓库中的备份数据来恢复 GitLab 服务器。以下是一般的步骤,用于重新建立 GitLab 服务器: 注意: 这些步骤假定您已经定期备份了 GitLab 数据,包括…...
华为云云耀云服务器L实例评测 | 实例使用教学之综合导览
华为云云耀云服务器L实例评测 | 实例使用教学之综合导览 实例使用教学实例场景体验实例性能评测实例评测使用介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器是什么华为云云耀云…...
Elasticsearch 高级查询用法
ES(Elasticsearch)查询语法是用于搜索和检索文档的强大工具,它支持多种查询类型和选项。以下是一些常见的查询语法示例: 1. **Match查询**:使用match查询可以执行全文本搜索。 { "query": { …...
网络架构介绍
1 网络 7 层架构 7 层模型主要包括: 1. 物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由 1、0 转化为电流强弱来进行传输,到达目的地后在转化为1、0…...
第53节——Redux Toolkit初识
一、什么是Redux Toolkit 1、概念 Redux Toolkit是一个官方支持的、用于简化Redux开发的工具集。它提供了一些简单易用的API和工具,可以帮助开发者更快速、更高效地编写Redux应用。 2、主要功能 简化Redux的配置 Redux Toolkit提供了一个createSlice函数&#…...
AndroidStudio报错:Plugin with id ‘kotlin-android‘ not found.
第一步 要在自己的项目的build.gradle的buildscript中添加ext.kotlin_version 1.3.72 第二步 然后在dependencies里添加classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 大体如下: buildscript {ext.kotlin_version 1.3.72r…...
【ADB】借助ADB模拟滑动屏幕,并进行循环
使用adb shell input 的swipe函数(应该是个函数) swipe x1 y1 x2 y2 time(以毫秒为单位) adb shell input swipe 1070 2200 1070 200 10000 进行循环 adb shell "for i in $(seq 1 10); do input swipe 1070 2200 1070 2…...
BN体系理解——类封装复现
from pathlib import Path from typing import Optionalimport torch import torch.nn as nn from torch import Tensorclass BN(nn.Module):def __init__(self,num_features,momentum0.1,eps1e-8):##num_features是通道数"""初始化方法:param num_features:特征…...
请求和响应的概述
请求:在浏览器地址栏输入地址,点击回车请求服务器,这个过程就是一个请求过程。 响应:服务器根据浏览器发送的请求,返回数据到浏览器在网页上进行显示,这个过程就称之为响应。 针对Servlet的每次请求&…...
(深度学习快速入门)A Gentle Introduction to Graph Neural Networks 笔记
博客链接沐神讲解视频文章目录 一:什么是图二:常见数据如何表示为图(1)图像(2)文本(3)Real WorldA:分子B:社交网络C:论文引用D:其他三:图涉及的任务(1)图级别任务(2)节点级别任务(3)边级别任务四:使用图数据的挑战...
VIM指令
vim的工作模式 vim一般有6种工作模式。 普通模式:使用vim打开一个文件时默认模式,也叫命令模式,允许用户通过各种命令浏览代码、滚屏等操作。 插入模式:也可以叫做编辑模式,在普通模式下敲击 i 、a 或 o 就进入插入模…...
Android 10.0 framework层实现app默认全屏显示
1.前言 在10.0的系统开发中,在对于第三方app全屏显示的功能需求开发中,需要默认app全屏显示,针对这一个要求,就需要在系统启动app 的过程中,在绘制app阶段就设置全屏属性,接下来就实现这个功能 效果图如下: 2.framework层实现app默认全屏显示的核心类 frameworks\base\…...
【计算机网络黑皮书】传输层
【事先声明】 这是对于中科大的计算机网络的网课的学习笔记,感谢郑烇老师的无偿分享 书籍是《计算机网络(自顶向下方法 第6版)》 需要的可以私信我,无偿分享,课程简介下也有 课程链接 目录 传输服务与协议网络层与传输…...
轻量限制流量?阿里云轻量应用服务器月流量包收费说明
阿里云轻量应用服务器部分套餐限制月流量,轻量应用服务器按照套餐售卖,有的套餐限制月流量,有的不限制流量。像阿里云轻量2核2G3M带宽轻量服务器一年108元和轻量2核4G4M带宽一年297.98元12个月,这两款是不限制月流量的。阿里云百科…...
Linux手记
常用的配置文件 文件作用/etc/profile系统级别的shell配置文件,它包含了系统中所有用户的默认环境变量和系统级别的全局配置信息/etc/apt/apt.conf配置APT(Advanced Package Tool)软件包管理器的行为,包括代理等/etc/apt/sources…...
springboot配置
一、配置文件的加载顺序 SpringApplication从以下位置的application.properties文件加载属性,并将它们添加到Spring Environment中去,优先级如下: 当前目录的/config子目录(src\config)当前目录(跟src目录…...
大数据中的一些词汇解释
OLTP(online Transaction Prrocessing) OLTP是一个处理面向事务的数据的软件系统。术语“在线交易”是指实时完成活动,而不是批处理。此数据是结构化数据的常见来源,可作为许多分析过程的输入。OLTP交易讲究实时性,就…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...
