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

1. 前言

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

2. 一般用法

#include<cstdio>
#include<climits>
using 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 #include<climits>
printf("%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))

转载于:https://www.cnblogs.com/gangzilife/p/10233667.html

宏定义中#和##的用法相关推荐

  1. 巧用c语言宏定义实现自动注释调试代码,C语言宏定义中的特殊用法

    C宏定义中的特殊用法 在分析一些C源码时,经常会遇到各种宏定义操作,本文即总结一下C语言宏定义中常见的预定义宏.调试宏:宏的条件编译用法及特殊的宏关键字用法. #undef 限定宏的作用域 一般来讲宏 ...

  2. do...while(0)在宏定义中的巧妙用法

    大家都知道,do-while(condition)可以表示循环,但你有没有遇到在一些宏定义中可以不用循环的地方,也用到了 do-while.比如: #define DELETE_POINTER(p) ...

  3. #define宏定义中的#,##,@#,\ 这些符号的神奇用法

    C/C++ 宏命令的神奇用法. 先看下面三条语句: #define Conn(x,y) x##y #define ToChar(x) #@x #define ToString(x) #x 1 2 3 ...

  4. C宏定义中的##,#,#@用法介绍

    关于字符串化和符号粘贴 2011-08-02 16:52:46.0      来源:博客园         作者:佚名 关键词:  字符串     C++   在C语言开发中,宏定义是一个非常有用的工 ...

  5. 空的宏定义作用及常见用法

    空的宏定义作用及常见用法 我们学习宏定义的第一个概念是,宏定义作为替换作用. 例如: #define SIZE 32 // 接下来代码使用SIZE就相当于32 宏定义是编译器在编译时,将程序中所有SI ...

  6. 宏定义Define的一些用法

    ---转载百度文库 一. #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处 ...

  7. 宏定义中的 ## ... __VA_ARGS__

    宏定义中的##操作符和... and _ _VA_ARGS_ _ 1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operat ...

  8. #与##在宏定义中的--宏展开

    #与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int m ...

  9. define宏定义中的#,##,@#及\符号

    define宏定义中的#,##,@#及\符号 在#define中,标准只定义了#和##两种操作.#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串. 1.# (string ...

最新文章

  1. java ftp client_JAVA FTP CLIENT
  2. json例子(后台取消息)
  3. python图片-Python图像处理
  4. Spring Boot 配置文件 yml与properties
  5. 在ASP.NET AJAX中使用应用程序服务和本地化(3):用户个性化组件ProfileService
  6. android 5.1 raw,升级安卓5.1 三星S6/S6 edge将支持RAW
  7. (持续更新)webstorm快捷键及术语翻译
  8. 通过批处理调用SQL*Plus执行批量脚本
  9. 校园天翼客户端常见错误码
  10. 如何编写Firefox扩展
  11. java设计模式——adapter模式
  12. 谈谈我对证券公司一些部门的理解(前、中、后台)
  13. 10003 微信登录失败 redirect_uri域名与后台配置不一致
  14. SSM Chapter 12 SpringMVC扩展和SSM框架整合
  15. win7 bcdedit
  16. 学习如何使用html和css样式将两张图片叠加到另一张图片上,实现微信扫一扫二维码效果
  17. 【pytorch】tnn
  18. 数据集划分函数sklearn.model_selection.train_test_split参数详解
  19. 什么是C语言?到底难不难学?——新手问题篇
  20. 笔记本获取服务器上的文件,win7笔记本读取服务器里的文件肿么弄???

热门文章

  1. 如何共享计算机磁盘,扩展群集共享磁盘的分区 - Windows Server | Microsoft Docs
  2. fiddler弱网测试_用fiddler实现弱网测试
  3. idea自动整理代码快捷键_MDK进阶使用教程,快捷启动任意软件,自动整理格式化代码,方便代码整理可以很好 的提高效率...
  4. python私有成员与公有成员_Python访问限制私有还是公有的介绍(附示例)
  5. java实验三多态性_Java实验3 类的多态性和接口
  6. 深度相机(七)--体感设备对比
  7. 高中信息技术——进制与编码刷题点整理
  8. 记安卓屏固件升级步骤
  9. 计算机网络常用术语WWW,计算机网络常用术语
  10. 一小时精通SVN版本控制 之五 团队协作开发