`
javatoyou
  • 浏览: 1083445 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

C语言中:使用宏包括单双井(#&&##)号可变参数

 
阅读更多

Warning" "divider == 0" "/n");

  } while(0);

  这样每次divider(除数)为0的时候便会在标准错误流上输出一个提示信息。

  而##被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。比如你要做一个菜单项命令名和函数指针组成的结构体的数组,并且希望在函数名和菜单项命令名之间有直观的、名字上的关系。那么下面的代码就非常实用:

  struct command

  {

  char * name;

  void (*function) (void);

  };

  #define COMMAND(NAME) { NAME, NAME ## _command }

  //然后你就用一些预先定义好的命令来方便的初始化一个command结构的数组了:

  struct command commands[] = {

  COMMAND(quit),

  COMMAND(help),

  ...

  }

  COMMAND宏在这里充当一个代码生成器的作用,这样可以在一定程度上减少代码密度,间接地也可以减少不留心所造成的错误。我们还可以n个##符号连接 n+1个Token,这个特性也是#符号所不具备的。比如:

  #define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d

  typedef struct _record_type LINK_MULTIPLE(name,company,position,salary);

  //这里这个语句将展开为:

  // typedef struct _record_type name_company_position_salary;

  关于...的使用

  ...在C宏中称为Variadic Macro,也就是变参宏。比如:

  #define myprintf(templt,...) fprintf(stderr,templt,__VA_ARGS__)

  //或者

  #define myprintf(templt,args...) fprintf(stderr,templt,args)

  第一个宏中由于没有对变参起名,我们用默认的宏__VA_ARGS__来替代它。第二个宏中,我们显式地命名变参为args,那么我们在宏定义中就可以用 args来代指变参了。同C语言的stdcall一样,变参必须作为参数表的最有一项出现。当上面的宏中我们只能提供第一个参数templt时,C标准要求我们必须写成:

  myprintf(templt,);

  的形式。这时的替换过程为:

  myprintf("Error!/n",);

  替换为:

  fprintf(stderr,"Error!/n",);

  这是一个语法错误,不能正常编译。这个问题一般有两个解决方法。首先,GNU CPP提供的解决方法允许上面的宏调用写成:

  myprintf(templt);

  而它将会被通过替换变成:

  fprintf(stderr,"Error!/n",);

  很明显,这里仍然会产生编译错误(非本例的某些情况下不会产生编译错误)。除了这种方式外,c99和GNU CPP都支持下面的宏定义方式:

  #define myprintf(templt, ...) fprintf(stderr,templt, ##__VAR_ARGS__)

  这时,##这个连接符号充当的作用就是当__VAR_ARGS__为空的时候,消除前面的那个逗号。那么此时的翻译过程如下:

  myprintf(templt);

  被转化为:

  fprintf(stderr,templt);

  这样如果templt合法,将不会产生编译错误。 这里列出了一些宏使用中容易出错的地方,以及合适的使用方式。

分享到:
评论

相关推荐

    OpenCV部署YOLOv5-pose人体姿态估计(C++和Python双版本).zip

    OpenCV部署YOLOv5-pose人体姿态估计(C++和Python双版本).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!

    ARIMA+Transformer+LSTM心跳时间序列预测模型源码+设计文档(课设新开发项目).zip

    ARIMA+Transformer+LSTM心跳时间序列预测模型源码+设计文档(课设新开发项目).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!

    体育馆管理系统(代码+数据库+LW)

    摘  要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此体育馆管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线选择试题并完成答题,在线查看考核分数。管理员管理收货地址管理、购物车管理、场地管理、场地订单管理、字典管理、赛事管理、赛事收藏管理、赛事评价管理、赛事订单管理、商品管理、商品收藏管理、商品评价管理、商品订单管理、用户管理、管理员管理等功能。体育馆管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:体育馆管理系

    基于HTML、TypeScript、JavaScript的全面运动健康手环App设计源码

    该项目是一款基于HTML、TypeScript和JavaScript全面构建的运动健康手环App设计源码,包含263个文件,涵盖124个TypeScript文件、93个SVG文件、10个JSON文件、10个PNG图片文件、9个JSON5文件、8个HTML文件、4个TS文件、2个gitignore文件和1个hvigorw文件。该App专注于提供全面的运动健康追踪功能,适用于追求健康生活方式的用户。

    2021科大讯飞车辆贷违预测大赛冠军源码+全部资料.zip

    2021科大讯飞车辆贷违预测大赛冠军源码+全部资料.zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!

    【锂电池剩余寿命预测】CNN卷积神经网络锂电池剩余寿命预测,马里兰大学锂电池数据集(Pytorch完整源码和数据)

    1.【锂电池剩余寿命预测】CNN卷积神经网络锂电池剩余寿命预测,马里兰大学锂电池数据集(Pytorch完整源码和数据) 2.数据集:马里兰大学锂电池数据集,已经处理好; 3.环境准备:python 3.8 , pytorch 1.8 版本及其以上,代码格式ipynb文件,可读性强; 4.模型描述:CNN-Transformer在各种各样的问题上表现非常出色,现在被广泛使用。 5.领域描述:近年来,随着锂离子电池的能量密度、功率密度逐渐提升,其安全性能与剩余使用寿命预测变得愈发重要。本代码实现了CNN卷积神经网络在该领域的应用。 6.作者介绍:机器学习之心,博客专家认证,机器学习领域创作者,2023博客之星TOP50,文章底部有博主联系方式。从事Matlab、Python算法仿真工作8年,更多仿真源码、数据集定制私信。

    企业微信社群规划运营全流程SOP.xlsx

    企业微信社群规划运营全流程SOP.xlsx

    基于Django自动化测试管理系统python源码+设计报告(高分项目).zip

    Django自动化测试管理系统python源码+设计报告(高分项目).zip [资源说明] 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常运行,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的高校学生、教师、科研工作者、行业从业者下载使用,可借鉴学习,也可直接作为毕业设计、课程设计、作业、项目初期立项演示等,也适合小白学习进阶,遇到问题不懂就问,欢迎交流。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 5、不懂配置和运行,可远程教学 欢迎下载,学习使用!

    同时语音翻译领域中大规模语言模型的应用与突破-CLASI系统研究

    内容概要:本文介绍了一个全新的名为CLASI(Cross Language Agent-Simultaneous Interpretation)的大规模语言模型(LLM),用于高质量和类似人工的实时语音同步翻译。CLASI模拟人类专业译员的方法,运用读写策略平衡质量和延迟,并利用跨模态检索生成增强型翻译结果。此外,引入了一个新的人工评估指标有效信息比例(VIP)。通过广泛的实验验证表明,无论是在常见的商业基准数据集上,还是在复杂多变的真实应用场景里,CLASI均显著超越现有最先进水平。特别地,针对中文到英文和反向翻译任务中,CLASI的VIP得分分别达到81.3%和78.0%,远高于其他已知的最佳性能系统。 适合人群:从事机器翻译和自然语言处理的研究人员和技术开发者;关注AI技术特别是深度学习、大规模预训练模型领域的科研工作者及从业者。 使用场景及目标:旨在开发高效能的同时语音翻译系统,在跨国会议、在线教育等多个领域提供无缝的语言交流解决方案,提升用户体验,弥合不同语言间的沟通鸿沟,推进全球化进程。该研究也为后续优化同时翻译系统的响应时间及质量提供了有益启示。 其他说明:本文提出了多项技术创新点,如多任务连续训练、情景学习能力强化等。这些贡献为未来改进和完善此类模型指明方向,有助于推动整个行业的进步与发展。

    迅雷精简迷你版本ThunderMini1.5.3.288

    迅雷精简迷你版本ThunderMini1.5.3.288

    CentOS搭建LAMP平台Web控制面板管理中文最新版本

    LAMP组合是指在Linux操作系统上部署Apache服务器、MySQL服务器以及PHP应用程序服务器,从而构建一个功能强大的Web动态网站开发平台。Apache作为全球排名第一的Web服务器软件,与PHP和MySQL的组合已成为Web服务器配置的一种标准。Webmin是一款基于Web界面的Linux系统管理工具,它允许用户通过Web控制面板来管理Linux系统上的各种服务。Webmin的模块化架构支持用户根据需要编写自定义的配置模块。本章将介绍如何修改模块以管理Web服务,对此感兴趣的读者可以进一步了解。

Global site tag (gtag.js) - Google Analytics