#和##在宏替换中的作用

#include <stdio.h>
#define f(a,b) a##b
#define g(a)  #a
#define h(a) g(a)
int main()
{
  printf("%s/n",h(f(1,2)));
  printf("%s/n",g(f(1,2)));
  return 0;
}

首先需要了解#和##的意义。
 
#  将右边的参数做整体的字符串替换。
 
#define g(a)  #a
 
则g(hello world) à hello world; g(sleep(1)) à sleep(1)
 
对于#的参数,即便是另一个宏,也不展开,仍然作为字符串字面信息输出。
 
所以,g(f(1,2)) à f(1,2)
 
对于h(f(1,2)),由于h(a)是非#或##的普通宏,需要先宏展开其参数a,即展开f(1,2)为12,则h(a) 宏替换为h(12),进而宏替换为g(12), 进而宏替换为12 
 
## 将左右两边的参数做整体的字符串拼接替换。
 
#define f(a,b) a##b
 
则f(1,2) à 12, f(i,1) à i1
 
同#,对于##的参数,即便是另一个宏,也不展开,仍然作为字符串字面信息输出。
 
此外,有一个限制是,经过##替换后的内容必须能够作为一个合法的变量。
 
以上f(i,1) à i1中,如果程序中没有i1的定义,或者通过f(1,i)构成1i,则即便是通过了宏替换,也不能编译通过。

--------------------------------------------------------------------------------

日常实践中,##是常用的替换。尤其在通过C的函数指针来模拟动态绑定时大有用处。
 
下面是从stackoverflow(具体id记不清了)上摘取的一个例子。

struct command
{
  char *name;
  void (*function) (void);
};
struct command commands[] =
{
  { "quit", quit_command },
  { "help", help_command },
  ...
};

构造一个这样的commands数组,是为了在后续的设计中,可以通过交互式的字符串输入,来动态地执行相应的函数。字符串自身作为前缀,”_command”作为后缀。

手工构造这样第一个commands数组显得非常冗余,还容易造成不必要的拼写错误。下面来看看这个宏替换版本。

#define COMMAND(NAME)  { #NAME, NAME ## _command } 
struct command commands[] =
{
COMMAND (quit),
COMMAND (help),
...
};

清晰了很多!

转载于:https://www.cnblogs.com/catgatp/p/8604245.html

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

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

相关文章

计算机辅助设计b实验目的,上海电力学院电路计算机辅助设计1--含有受控源电路辅助分析...

上海电力学院电路计算机辅助设计1--含有受控源电路辅助分析实验三&#xff1a;含有受控源电路辅助分析一、实验目的1. 用回路电流法和节点电压法求解电路中的电流和电压。 2. 掌握线性电路参数的测量的方法。3. 了解四种受控源元件(电流控制的电压源、电流控制的电流源、电压控…

云服务器ECS登陆注意点

使用阿里云控制台&#xff1a;远程连接(管理终端) 登陆Linux(CentOS)密码输入不能使用小键盘输入&#xff0c;只能使用键盘最上排的数字键输入。小键盘输入永远登陆不了。远程用ssh密匙登陆时Linux时&#xff0c;需要确认一下几点。/root/目录的权限是否是550&#xff0c;如果不…

计算机基本运行方式,我今天才知道的电脑运行方式,你知道吗?

计算机首先你必须是系统软件和应用软件的相互的结合&#xff0c;才能更好的开发出你电脑的应用平台&#xff0c;那么其实没有了软件系统&#xff0c;光有这些硬件&#xff0c;他能不能工作&#xff0c;其实是不能工作的电脑也就是废物一台。那么软件这些&#xff0c;就是合理的…

计算机修复画笔结果分析,Photoshop

Photoshop基础:使用修复画笔工具修复画笔工具和修补工具&#xff0c;其实都是基于我们前面所说的图章工具的派生工具&#xff0c;并弥补了图章工具的一些不足。那么图章工具有什么不足之处呢&#xff1f;通过前面的学习我们知道了图章工具对图案的复制是原样照搬的&#xff0c;…

Centos7安装图形桌面

yum groupinstall "GNOME Desktop" "Graphical Administration Tools" #安装 startx #进入图形桌面 转载于:https://www.cnblogs.com/killall007/p/8607905.html

终端到服务器丢包,服务器丢包 ping的时候产生丢包的解决方法

通常有以下几种原因:守望,数据,采集,网络,技术,站长,源码,小说,图片,seo,ALEXA3^ X gu K O1.由于服务器的IIS中运行了非法或者没有独立进程池的原因,找到这个站点,给他一个独立的进程池2.如果服务器上捆绑了一个主机头为空的站点的话,容易造成这个问题,最好把这个主机为空的站点…

centos 默认php 版本太低移到高版本的办法

// centos 默认有php 版本太低转移到高版本的解决办法 php -v 版本低 ln -s /usr/local/php/bin/php /usr/bin/php转载于:https://www.cnblogs.com/zhanghanwen16/p/8610841.html

云服务器太卡,云服务器解决io过高导致的命令卡顿

查看操作系统负载[rootnode-master1Ewao ~]# cat /proc/cpuinfo | grep "process"processor: 0processor: 1processor: 2processor: 3[rootnode-master1Ewao ~]# w15:42:05 up 72 days, 22:09, 1 user, load average: 24.43, 20.18, 18.37USER TTY LOGIN IDLE JCPU P…

服务器的虚拟化配置,怎么配置服务器的虚拟化环境

服务器虚拟化是科技发展的产物&#xff0c;使得在一台服务器上同时执行多个操作系统、提供服务成为可能&#xff0c;优化了企业内部资源&#xff0c;节省成本。服务器虚拟化是IT基础架构得以资源共享的做法&#xff0c;也是未来机房的重要元素之一&#xff0c;那我们怎么配置这…

dubbo实现原理之SPI简介

dubbo采用微内核插件体系&#xff0c;设计优雅&#xff0c;扩展性很强。微内核插件体系是如何实现的呢&#xff1f;想必大家都知道SPI(service provider interface)机制。这种机制的原理是假如我们定义了服务接口标准&#xff0c;可以让厂商无实现。在jdk中&#xff0c;使用Ser…

qq游戏坦大战服务器维护中,高手教你如何解决QQ游戏问题

许多玩QQ游戏的朋友&#xff0c;可能会发现忽然有一天自己的QQ游戏进不去了&#xff0c;无法打开QQ游戏了&#xff0c;就算重装游戏也不行&#xff0c;出现“加载DLL失败”的提示。现将各种情况的DLL文件加载失败解决办法收集起来&#xff0c;希望能对大家有所帮助。1.加载cnsm…

华硕笔记本没有无线服务器,华硕笔记本连不上无线网络怎么解决

可能还有些网友不太清楚关于华硕笔记本连不上无线网络的问题&#xff0c;下面就由学习啦小编给你们介绍华硕笔记本连不上无线网络的解决方法吧&#xff0c;希望能帮到大家哦!华硕笔记本连不上无线网络的解决方法一&#xff1a;1、首先我们来检测是否是无线路由器的问题。为了确…

Maven知识点整理

Maven不仅是依赖管理工具&#xff0c;准确来说是一个项目管理工具&#xff0c;贯穿了整个项目生命周期&#xff0c;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布...依赖是使用Maven坐标来定位的&#xff0c;而Maven坐标 主要 由GAV&#xff08;groupId, artifactId, …

企业案例(二):增量恢复案例

1、环境准备 条件: 1.具备全量备份&#xff08;mysqldump&#xff09;。 2.除全量备份以外&#xff0c;还有全量备份之后产生的的所有binlog增量日志。 1.1、建立数据库和表 CREATE DATABASE dadong; USE dadong; CREATE TABLE test (id int(4) NOT NULL AUTO_INCREMENT,name c…

gdc服务器维修公司,gdc服务器阵列架坏了

gdc服务器阵列架坏了 内容精选换一换本章节指导用户批量创建4块云硬盘&#xff0c;并挂载至云服务器。进入云硬盘页面。关于创建云硬盘的详细操作&#xff0c;请参见“云硬盘用户指南”。本示例为批量创建4块云硬盘&#xff0c;具体参数如图1所示。云硬盘规格支持任意用户(root…

Python3中遇到UnicodeEncodeError: 'ascii' codec can't encode characters in ordinal not in range(128)...

现象 打印任何一种包含有中文的对象&#xff0c;字典、列表、DataFrame、或字符串。比如&#xff1a; print(中文) 控制台报错&#xff1a; Traceback (most recent call last):File "printcn.py", line 1, in <module>print(\u4e2d\u6587) UnicodeEncodeError…

手机文件传云服务器,手机云服务器传文件

手机云服务器传文件 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。如果私钥文件丢失了&#xff0c;可以为服务器替换新的密钥对&a…

Experimental-work1

软件测试第一次实验报告 3015207191 软件工程3班 林家乐 一、安装Junit&#xff0c;Hamcrest和Eclemma: 1.安装Junit 下载junit.jar&#xff0c;在项目里添加junit.jar并build一下即可。使用时&#xff0c;在项目内包含Junit4的库&#xff0c;其中包含junit.jar即…

c 开发服务器的性能,高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了...

1、前言在本系列文章的上篇中我们回顾了过云的10年里&#xff0c;高性能网络编程领域著名的C10K问题及其成功的解决方案(上篇请见&#xff1a;《高性能网络编程(二)&#xff1a;上一个10年&#xff0c;著名的C10K并发连接问题》)。本文将讨论单机服务器实现C10M(即单机千万并发…

puppet(2)-资源介绍

puppet- 资源介绍&#xff1a; 类型、属性与状态同实现方式分离、仅指定目标状态 type {title:attribute > value,...}查看支持的资源类型&#xff1a; puppet describe -lpuppet describe -s TYPEpuppet describe TYPE定义资源的要点&#xff1a; 1、同一种类型中…