1. 前言

https://blog.csdn.net/baidu_33850454/article/details/79363033

使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.

2. 一般用法

#include#includeusing namespace std;#define STR(s) #s#define CONS(a,b) int(a##e##b)int main(){ printf(STR(vck)); // 输出字符串"vck" printf("%d\n", CONS(2,3)); // 2e3 输出:2000 return 0;}3. 注意事项

当宏参数是另一个宏的时候,需要注意的是凡宏定义里有用’#’或’##’的地方宏参数是不会再展开.

即, 只有当前宏生效, 参数里的宏!不!会!生!效 !!!!

3.1 举例

#define A (2)#define STR(s) #s#define CONS(a,b) int(a##e##b)printf("int max: %s\n", STR(INT_MAX)); // INT_MAX #includeprintf("%s\n", CONS(A, A)); // compile error --- int(AeA)

两句print会被展开为:

printf("int max: %s\n","INT_MAX");printf("%s\n", int(AeA));

分析:

由于A和INT_MAX均是宏,且作为宏CONS和STR的参数,并且宏CONS和STR中均含有#或者##符号,所以A和INT_MAX均不能被解引用。导致不符合预期的情况出现。

3.2 解决方案

解决这个问题的方法很简单. 加多一层中间转换宏. 加这层宏的用意是把所有宏的参数在这层里全部展开,

那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数.

#define A (2)#define _STR(s) #s#define STR(s) _STR(s) // 转换宏#define _CONS(a,b) int(a##e##b)#define CONS(a,b) _CONS(a,b) // 转换宏

结果:

printf("int max: %s\n",STR(INT_MAX));//输出为: int max:0x7fffffff//STR(INT_MAX) --> _STR(0x7fffffff) 然后再转换成字符串; printf("%d\n", CONS(A, A));//输出为:200//CONS(A, A) --> _CONS((2), (2)) --> int((2)e(2))

quot在c语言里用法,C语言中“#”和quot;##quot;的用法相关推荐

  1. C语言变长数组 struct中char data[0]的用法

    摘要:在实际的编程中,我们经常需要使用变长数组,但是C语言并不支持变长的数组.此时,我们可以使用结构体的方法实现C语言变长数组. struct MyData  {  int nLen;  char d ...

  2. C语言getline函数CSDN,c++中的两种getline用法详解

    getline是C++标准库函数:但不是C标准库函数,而是POSIX(IEEE Std 1003.1-2008版本及以上)所定义的标准库函数(在POSIX IEEE Std 1003.1-2008标准 ...

  3. python iloc用法_pandas-03 DataFrame()中的iloc和loc用法

    pandas-03 DataFrame()中的iloc和loc用法 简单的说: iloc,即index locate 用index索引进行定位,所以参数是整型,如:df.iloc[10:20, 3:5 ...

  4. C语言学习3:printf中%X及其相关的用法

    /*2019年10月3日08:29:48目的:测试%x %X %#x %#X的用法 */# include <stdio.h>int main(void) {int x = 47; pri ...

  5. C语言fstream用法,c++ fstream中seekg()和seekp()的用法

    先说一下C语言中fseek()的功能: 函数原型:int fseek(FILE *fp, LONG offset, int origin) 参数含义:fp 文件指针 offset 相对于origin规 ...

  6. oracle里的concat,oracle 中的 CONCAT,substring ,MINUS 用法

    有的时候,我们有需要将由不同栏位获得的资料串连在一起.每一种资料库都有提供方法来达到这个目的: MySQL: CONCAT() Oracle: CONCAT(), || SQL Server: + C ...

  7. python中的split函数的用法实例_python中的split()函数的用法

    函数:split() Python中有split()和os.path.split()两个函数,具体作用如下: split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(li ...

  8. python3的formatter_python中的formatter的详细用法

    今天抽空学习了一下python中的string service中的formatter的相关用法,主要是为了让自己的代码看起来更加和谐,因为很多java或者c语言过来的开发者都不怎么爱使用python的 ...

  9. php request time,php中time()与$_SERVER[REQUEST_TIME]用法区别分析

    php中time()与$_SERVER[REQUEST_TIME]用法区别分析 发布于 2015-01-26 08:56:46 | 143 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本 ...

  10. python中 r是什么意思_python中\r的意义及用法

    \r的意义 \r 表示将光标的位置回退到本行的开头位置 \b表示将光标的位置回退一位 在python里print会默认进行换行,可以通过修改参数让其不换行 (1) python2中可以在print语句 ...

最新文章

  1. 《利用Python》进行数据分析:Numpy基础9 数组转置和轴对换
  2. ggplot2设置坐标轴范围_Matplotlib入门-2-坐标轴axis/axes设置
  3. c mysql 的默认值_为mysql表字段设置默认值的方法及注意细节
  4. [python opencv 计算机视觉零基础到实战] 七、逻辑运算与应用
  5. 网易严选Java开发三面面经:南京黑马java培训怎么样
  6. java中br.readline_Java:java中BufferedReader的read()及readLine()方法的使用心得
  7. mock如何为空_如何 mock 数据
  8. excel手机版_手机自带便签如何导入新手机?试试这款便签同步助手
  9. Git 基础(七)—— 远程仓库(GitHub)
  10. atiny_log | LiteOS 物联网操作系统中的日志打印组件使用分享
  11. ami编码设计流程图_AMI码型变换
  12. 用anaconda下载安装pytorch1.8.1+cudatoolkit11.1
  13. [内附完整源码和文档] 基于C#和SQL Server 2008的自助点餐系统设计与实现
  14. 如何做一个讨厌的女人
  15. 仙侣情缘之麒麟劫java_《仙侣情缘之麒麟劫》最终支线攻略
  16. [Js_Testing]3分钟学会Mocha+Chai单元测试
  17. Unity 使用教程 之 Unity3D常用的知识点归纳
  18. 电视+私人影院+KTV+游戏厅,爽!
  19. 一个或多个数据库无法访问,因而不会在数据库访问选项卡中显示
  20. Redis主从复制、Redis哨兵模式、Redis集群

热门文章

  1. 90后告别第一份工作后,更青睐新一线城市开启职场第二步
  2. gitlab 如何调出工程的setting
  3. Linux系统裁减之,制作一个极度精简的Linux-5-重新编译login去除对pam模块的依赖...
  4. ASP.NET MVC 添加Model并连接到本地数据库
  5. 活动目录父子域用户迁移之:TFSSharePoint问题汇总(一)
  6. 听飞狐聊JavaScript设计模式系列12
  7. javascript 浮点计算问题解决思路
  8. 揭示Win32 API拦截细节/API hooking revealed (2)
  9. SQL Server数据行的物理空间分配
  10. 电脑重装系统U盘引导不了