C宏中的##(token pasting)

news/2024/9/15 22:58:07/文章来源:https://www.cnblogs.com/smartljy/p/18395709

C宏中的##(token pasting)

以下内容来自GPT

在 C 和 C++ 中,## 运算符称为“token pasting”运算符或“粘贴”运算符,用于宏定义中。当使用 ## 运算符时,它会将前后的标记(token)直接拼接在一起。在 __VA_ARGS__ 前面使用 ## 运算符有一个特定的用途,主要是在处理变参宏时避免多余的逗号。

作用解释:

在变参宏中,如果你使用 __VA_ARGS__ 并且调用宏时没有传递任何可变参数,那么会出现一个多余的逗号,导致语法错误或不期望的行为。例如:

#define DEBUG_LOG(fmt, ...) fprintf(stderr, fmt, __VA_ARGS__)

假设你这样调用宏:

DEBUG_LOG("A message");

展开后会变成:

fprintf(stderr, "A message", );

这会在 fprintf 函数调用中留下一个多余的逗号,导致编译错误。

为了防止这种情况,使用 ##__VA_ARGS__ 来自动去掉这个多余的逗号。

示例:

#define DEBUG_LOG(fmt, ...) fprintf(stderr, fmt, ##__VA_ARGS__)

__VA_ARGS__ 是空的时候,## 会将前面的逗号自动移除。例如:

  • 有可变参数:

    DEBUG_LOG("Value: %d", 42);
    

    展开后:

    fprintf(stderr, "Value: %d", 42);
    
  • 没有可变参数:

    DEBUG_LOG("A message");
    

    展开后:

    fprintf(stderr, "A message");
    

在这种情况下,##__VA_ARGS__ 确保即使没有传递可变参数,宏的展开依然是合法的,不会留下多余的逗号。

总结:

##__VA_ARGS__ 的主要作用是在变参宏中,当 __VA_ARGS__ 为空时,自动去掉前面的逗号,确保宏的展开结果是有效的 C/C++ 代码。

注意事项

如果用##来连接字符串,那么要注意:这个连接操作发生在宏展开之前。

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

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

相关文章

Max–min 不等式,KTT 条件,以及不等式的对偶形式

嚙踝蕭嚙踝蕭打打だいず - Worlds end loneliness 打打 的 音 色太 具 代 表性 而且在这么高的 BPM 还能表达出清晰的感情,真乃神曲 . 依旧是笑林广记: 老僧往后园出恭,误被笋尖搠入臀眼,乃唤疼不止。小沙弥见之,合掌云:“阿弥陀佛,天报。” 在三次互反律证明之前发现有…

052205144张诗悦

这个作业属于哪个课程 软件工程这个作业要求在哪里 作业要求这个作业的目标 熟练使用AIGC 博客园 markdown,对课程的有一个清晰规划学号 052205144一、个人logo文生图任务 1.使用免费的AIGC图像生成工具为我的Github和博客园账号创建一个独特的个人Logo。使用工具:[豆包](豆…

论文速读纪录 - 202408

新鲜出炉的八月份论文阅读记录特别鸣谢kimi,以下论文均在kimi辅助下阅读。 目录RMIB: Representation Matching Information Bottleneck for Matching Text Representations AttentionRank: Unsupervised keyphrase Extraction using Self and Cross Attentions ANSWERING COM…

Redis 入门 - 简介

如何学习Redis,如何快速入门,相信Redis入门系列可以给你提供帮助。Redis是Remote Dictionary Server的缩写,可以翻译成远程字典服务。Redis是用C语言编写的开源项目。 Redis 最主要的特点就是高性能,对于简单的键值读取速度可以达到100000次/s,在理想情况下简单的键值写入…

2024软件工程博客园第一次作业

这个作业属于哪个课程 首页 - 软件工程2024 - 福州大学 - 班级博客 - 博客园 (cnblogs.com)这个作业要求在哪里 2024秋软件工程个人作业(第一次) - 作业 - 软件工程2024 - 班级博客 - 博客园 (cnblogs.com)这个作业的目标 搭建自己的博客,写下自己的个人情况和愿景学号 1022…

不可不知的WPF形状(Shape)

在WPF开发中经常需要进行绘制图形,可以利用Shape类型绘制基本的形状,而且Shape派生自FrameworkElement,属于UI元素范畴,可以直接利用XAML进行绘制。本文通过一些简单的小例子,简述如何通过Shape类绘制形状,仅供学习分享使用,如有不足之处,还请指正。在WPF开发中经常需要…

软件工程第一次个人作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13243这个作业的目标 学会使用Aigc工具生成个人logo,搭建github个人网站,并熟悉markdown编辑,进行自我知识和技能评估学号 1022011…

日本出行

必备飞机 https://www.bilibili.com/video/BV1RC411J7tf/ 前3分钟 南航 全日空航空 出行公交卡(西瓜卡,首充1000 711消费完) 车次 15:42 https://www.bilibili.com/video/BV1j64y1A7x1/ 车次 13:24 https://www.bilibili.com/video/BV1RC411J7tf pasmo卡(只支持地铁,不支持…

智慧环卫:城市清洁的未来图景与技术革新

在智慧城市的宏伟蓝图中,“智慧环卫”正以其独特的姿态,悄然改变着城市的清洁与环境卫生管理方式。智慧环卫不仅仅是技术的简单应用,更是城市管理智慧化、生态化的重要体现。本文旨在深入探讨智慧环卫的内涵、技术支撑、实践案例及对城市环境改善的深远影响。智慧环卫:定义…

AWC 批量查询使用关系的最新版本并导出Excel

1.查询使用关系的方法:* 调用查询返回数据* @param {Object} data* @returns {Promise}* */ export let queryItemRevisionById = function (data) {if (!data.item_id) {messagingService.showInfo("请输入查询条件");return;}var item_id=data.item_id.dbValue.re…

Docker 简介

首先说明一些特性:一个容器中只有一个主进程,遵循单一原则,否则一个容器挂了会导致多个进程挂掉;容器其实就是一个进程,docker可以管理这些进程。docker能够进行容器隔离,我们操作的其实是docker客户端,而不是server端。 docker info # 查看docker信息docker基本概念 doc…

阿里重磅开源Qwen2-VL:超越人类的视觉理解能力,从医学影像到手写识别,这款开源多模态大模型究竟有多强?(附本地化部署教程)

阿里重磅开源Qwen2-VL:超越人类的视觉理解能力,从医学影像到手写识别,这款开源多模态大模型究竟有多强?(附本地化部署教程)模型介绍 最近呢,阿里巴巴开源了Qwen2-VL,在多模态大模型展现了在实际应用中的巨大潜力,尤其是在处理跨模态数据方面表现出众。以下是该模型的几…