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

宏定义中#与##的注意事项

1. #是字符串化操作符。它的作用是将宏参数转换成字符串

2. ##是标记粘贴操作符。它的作用是将两个标记连接起来形成一个新的标记

#define TEST1(a) #a
#define TEST2(a) b##a/***********************************************************/
举例:TEST1(hello) 会被替换为 "hello" 字符串TEST2(hello)会被替换为 bhello, 编译过程中会将bhello当作一个变量
/***********************************************************/

字符串拼接

#define HELLO_WORLD "Hello, " "World!"/***********************************************************/
在HELLO_WORLD中,"Hello, " "World!" 会被连接为 "Hello, World!"HELLO_WORLD 会被替换为 "Hello, World!" 字符串
/***********************************************************/

利用#将宏参数转换成字符串的特性可以完成字符串的拼接:

#defien HELLO(a) "hello"#a/***********************************************************/
举例:
HELLO(bye)会被替换为 "hellobye" 字符串HELLO(bye) 被转换为 "hello""bye" 再转换为 "hellobye"/***********************************************************/

重要事项

1. 在C或C++中的宏定义中,#运算符(被称为“字符串化”)只能用于宏参数。这意味着#必须直接跟在参数名称后面,不能有任何东西介于#和参数名称之间。换句话说,你不能在#和参数名之间添加任何非空白的字符。

错误案例:

#define STRING(a) nihao##a
#define TOSTRING(a) #STRING(a)/*********************************************/这个案例似乎想将nihao与参数a进行拼接并转换为字符串
但是#与参数之间不能存在其他字符,因此#操作符在此处其实是失效的
执行TOSTRING(a)等价于执行了STRING(a)
TOSTRING(a) 会被替换为 nihaoa, 编译过程中会将nihaoa当作一个变量。因为#操作符的无效/*********************************************/

2. ##符号两侧的空格会被忽略

#define CONCAT1(a,b) a##b#define CONCAT2(a,b) a  ##  b/****************************************/CONCAT1(a,b) 与 CONCAT2(a,b) 都会被替换为ab变量/****************************************/

3. ##运算符还有一个特殊的作用,就是当它跟在一个逗号后面,并且其后面继续跟随如##__VA_ARGS__的类型参数为空时,预处理器就会消除这个逗号

_VA_ARGS__ 是C语言预处理器定义的一个指示符,它代表了可变参数的列表。它主要用于宏的定义中,当你需要定义一个接收可变数量参数的宏时。

#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__ )/*****************************************************/上述宏如果被传递一个参数,例如 FOO( "Hello, world!" ),
则__VA_ARGS__为空,此时##会去掉前面的逗号,从而避免了语法错误。/******************************************************/

#__VA_ARGS__将会把__VA_ARGS__转化为字符串。


#define DEBUG(...) ##__VA_ARGS__/*********************************************/DEBUG(ni, hao, a) 会被替换为 "ni, hao, a" 字符串/**********************************************/

相关文章:

宏定义中#与##的注意事项

1. #是字符串化操作符。它的作用是将宏参数转换成字符串 2. ##是标记粘贴操作符。它的作用是将两个标记连接起来形成一个新的标记 #define TEST1(a) #a #define TEST2(a) b##a/***********************************************************/ 举例:TEST1(hello) 会…...

Java函数式编程

Java函数式编程 Java函数式编程(Functional Programming in Java)是指使用函数式编程范式来编写Java代码的一种编程方式。函数式编程是一种编程范式,它强调使用函数作为基本构建块,并将计算视为数学上的函数求值,避免…...

【深度优先搜索】【树】【C++算法】2003. 每棵子树内缺失的最小基因值

作者推荐 动态规划的时间复杂度优化 本文涉及知识点 深度优先搜索 LeetCode2003. 每棵子树内缺失的最小基因值 有一棵根节点为 0 的 家族树 ,总共包含 n 个节点,节点编号为 0 到 n - 1 。给你一个下标从 0 开始的整数数组 parents ,其中…...

电脑开机显示器没有信号而且键盘鼠标不亮怎么解决?

大家在使用电脑的过程,开机没有反应是比较经常遇到的问题,就有用户反映说自己的电脑启动之后,显示器无信号,键盘鼠标灯也不亮,怎么操作都没有效果。对开机有影响的硬件主要是内存条,内存条是非常容易松动的,而且金手指如果氧化了,都会导致开不了机 大家在使用电脑的过程…...

RLWE同态加密编码打包——系数打包

RLWE同态加密的明文域 RLWE的加密方案,如BGV、BFV,加密的对象,实际上是分圆多项式环上的一个整系数多项式。而我们在平时接触到的需要加密的数据,如图像或者工资,通常是一个数。所以,在使用RLWE同态加密时…...

Codeforces Round 930 (Div. 2 ABCDEF题) 视频讲解

A. Shuffle Party Problem Statement You are given an array a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1​,a2​,…,an​. Initially, a i i a_ii ai​i for each 1 ≤ i ≤ n 1 \le i \le n 1≤i≤n. The operation swap ( k ) \texttt{swap}(k) swap(k) for an…...

【LeetCode-中等】209.长度最小的子数组-双指针/滑动窗口

力扣题目链接 1. 暴力解法 这道题的暴力解法是两层嵌套for循环,第一层循环从 i 0 开始遍历至数组末尾,第二层循环从 j i 开始遍历至找到总和大于等于 target 的连续子数组,并将该连续子数组的长度与之前找到的子数组长度相比较&#xff0…...

MACOS/LINUX/WINDOWS C++ 获取当前可执行程序的完整路径

依赖本人写的多平台编译器宏判断&#xff1a; C/C MACOS、Windows、Linux、HarmonyOS 平台宏判断-CSDN博客 MACOS头文件依赖&#xff1a; #if defined(_MACOS) #include <libproc.h> #endif #include <mach-o/dyld.h> 只需要链接 libSystem.dylib 就行了&#…...

【Nginx笔记02】通过Nginx服务器转发客户端的WebSocket接口到后端服务

这篇文章&#xff0c;主要介绍如何通过Nginx服务器转发客户端的WebSocket接口到后端服务【知识星球】。 目录 一、Nginx配置WebSocket 1.1、Nginx配置内容 1.2、客户端请求地址 1.3、创建WebSocket测试工程 1.4、启动测试 1.5、WebSocket超时问题 1.5.1、设置超时时间 …...

关于高德地图及其APP获取地图数据的研究

刚过完春节没几天&#xff0c;有个客户提出要获取高德地图的数据。 我看了下&#xff0c;回复说&#xff1a;这不是很简单嘛&#xff0c;高德有公开的开放平台&#xff0c;有足够的API支持用户获取数据&#xff0c;开发自己基于高德数据库的应用。 客户回复说&#xff1a;他的要…...

【Python入门教程】Python实现鸡兔同笼

今天跟大家分享一下很久之前自己做的鸡兔同笼求解问题的小游戏&#xff0c;使用公式和基本的判断语句即可实现&#xff0c;可以用来当练手或者消磨时间用。 大家在编代码的时候最重要就是先理清逻辑思路&#xff0c;例如应该套几层循环、分几个模块等等。然后在编码时可以先随意…...

微信小程序,h5端自适应登陆方式

微信小程序端只显示登陆(获取opid),h5端显示通过账户密码登陆 例如: 通过下面的变量控制: const isWeixin ref(false); // #ifdef MP-WEIXIN isWeixin.value true; // #endif...

物体检测-系列教程20:YOLOV5 源码解析10 (Model类前向传播、forward_once函数、_initialize_biases函数)

&#x1f60e;&#x1f60e;&#x1f60e;物体检测-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 14、Model类 14.2 前向传播 def forward(self, x, augmentFalse, profileFalse):if augm…...

贪吃蛇(C语言)步骤讲解

一&#xff1a;文章大概 使用C语言在windows环境的控制台中模拟实现经典小游戏 实现基本功能&#xff1a; 1.贪吃蛇地图绘制 2.蛇吃食物的功能&#xff08;上&#xff0c;下&#xff0c;左&#xff0c;右方向控制蛇的动作&#xff09; 3.蛇撞墙死亡 4.计算得分 5.蛇身加…...

MySQL 数据库表设计和优化

一、数据结构设计 正确的数据结构设计对数据库的性能是非常重要的。 在设计数据表时&#xff0c;尽量遵循一下几点&#xff1a; 将数据分解为合适的表&#xff0c;每个表都应该有清晰定义的目的&#xff0c;避免将过多的数据存储在单个表中。使用适当的数据类型来存储数据&…...

JavaScript进阶-高阶技巧

文章目录 高阶技巧深浅拷贝浅拷贝深拷贝 异常处理throw抛异常try/caych捕获异常debugger 处理thisthis指向改变this 性能优化防抖节流 高阶技巧 深浅拷贝 只针对引用类型 浅拷贝 拷贝对象后&#xff0c;里面的属性值是简单数据类型直接拷贝值&#xff0c;如果属性值是引用数…...

C语言中“#“和“##“的用法

1. 前言 # &#xff1a;把宏参数变为一个字符串, ##&#xff1a;把两个宏参数贴合在一起. 2. 一般用法 #include<stdio.h> #define toString(str) #str //转字符串 #define conStr(a,b) (a##b)//连接 int main() { printf(toString(12345)): //输出字符串&q…...

Linux命令-clock命令(用于调整 RTC 时间)

说明 clock命令用于调整 RTC 时间。 RTC 是电脑内建的硬件时间&#xff0c;执行这项指令可以显示现在时刻&#xff0c;调整硬件时钟的时间&#xff0c;将系统时间设成与硬件时钟之时间一致&#xff0c;或是把系统时间回存到硬件时钟。 语法 clock [--adjust][--debug][--dir…...

编程笔记 Golang基础 045 math包

编程笔记 Golang基础 045 math包 一、math包主要功能常量&#xff1a;函数&#xff1a;数值运算&#xff1a;三角函数&#xff1a;对数函数&#xff1a;随机数相关&#xff1a; 二、示例代码一三、示例代码二小结 Go 语言的标准库 math 提供了一系列基础数学函数和常量&#xf…...

[Java 探索者之路] 一个大厂都在用的分布式任务调度平台

分布式任务调度平台是一种能够在分布式计算环境中调度和管理任务的系统&#xff0c;在此环境下&#xff0c;各个任务可以在独立的节点上运行。它有助于提升资源利用率&#xff0c;增强系统扩展性以及提高系统对错误的容忍度。 文章目录 1. 分布式任务调度平台1. 基本概念1.1 任…...

银保监现场检查倒计时:如何 1 天内生成全量口径文档?

面对银保监现场检查对数据口径“可追溯、可验证”的严苛要求&#xff0c;传统人工或表级血缘工具效率低下且准确性不足。本文介绍基于 算子级血缘 与 主动元数据 的自动化解决方案&#xff0c;通过将复杂 SQL 加工逻辑“白盒化”&#xff0c;实现监管指标口径的 一键溯源 与 自…...

PDFtoPrinter完整指南:3分钟掌握.NET PDF打印终极方案

PDFtoPrinter完整指南&#xff1a;3分钟掌握.NET PDF打印终极方案 【免费下载链接】PDFtoPrinter .Net Wrapper over PDFtoPrinter util allows to print PDF files. 项目地址: https://gitcode.com/gh_mirrors/pd/PDFtoPrinter 还在为.NET应用中复杂的PDF打印功能而头…...

告别 Notion AI 付费:利用 Gemini Client 自建最强笔记助手

前言 Notion作为现在最流行的笔记工具之一&#xff0c;其功能完整和页面美观而广受好评&#xff0c;但是它的ai功能是要钱的&#xff01;每月10美金&#xff01;这对笔者来说是不太能接受的&#xff0c;正巧最近有了gemini的会员并下载安装了cli&#xff0c;再加上最近酷爱逛魔…...

VSCode插件Continue配置避坑指南:手把手教你无缝对接OpenStation的本地大模型服务

VSCode插件Continue配置避坑指南&#xff1a;手把手教你无缝对接OpenStation的本地大模型服务 当你已经成功部署了OpenStation的本地大模型服务&#xff0c;却在VSCode中配置Continue插件时遇到各种"拦路虎"&#xff0c;这篇文章就是为你准备的调试手册。我们将深入每…...

哔哩下载姬DownKyi完整使用教程:从零掌握B站视频高效下载与管理

哔哩下载姬DownKyi完整使用教程&#xff1a;从零掌握B站视频高效下载与管理 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印…...

League Akari终极指南:5大核心功能彻底解放你的英雄联盟游戏体验

League Akari终极指南&#xff1a;5大核心功能彻底解放你的英雄联盟游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为错过匹配确…...

封UDP与不封UDP的防护效果有什么不一样

UDP&#xff08;User Datagram Protocol&#xff09;&#xff0c;中文名是用户数据报协议&#xff0c;是OSI参考模型中一种无连接的传输层协议&#xff0c;也是最常见的作为流量攻击最多的一种协议&#xff0c;需要用到UDP的主要都是视频通讯&#xff0c;枪战类实时通讯的游戏类…...

SITS2026平台深度拆解:如何用1套配置实现92%业务场景零代码交付?(附Gartner验证的ROI测算模型)

第一章&#xff1a;SITS2026平台深度拆解&#xff1a;如何用1套配置实现92%业务场景零代码交付&#xff1f;&#xff08;附Gartner验证的ROI测算模型&#xff09; 2026奇点智能技术大会(https://ml-summit.org) SITS2026并非传统低代码平台的简单迭代&#xff0c;而是基于语义…...

EDEM仿真“隐形”几何与“罢工”颗粒工厂:常见故障排查与实战修复指南

1. 当EDEM几何模型突然"隐身"&#xff1a;从现象到修复的完整指南 第一次遇到EDEM里的几何模型突然消失时&#xff0c;我差点以为是自己眼花了。明明上次模拟还好好的模型&#xff0c;这次打开却只剩下空荡荡的粒子在飘荡。这种情况在工程仿真中其实很常见&#xff0…...

告别‘玄学’听诊:我是如何用Python和CNN-LSTM模型给心音‘打分’的(准确率92%)

告别‘玄学’听诊&#xff1a;我是如何用Python和CNN-LSTM模型给心音‘打分’的&#xff08;准确率92%&#xff09; 作为一名长期在医疗AI领域摸爬滚打的数据科学家&#xff0c;我始终被一个问题困扰&#xff1a;为什么21世纪的心脏听诊依然像中世纪占星术一样依赖"经验之…...