宏定义中#和##的用法
转载: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
宏定义中#和##的用法相关推荐
- 巧用c语言宏定义实现自动注释调试代码,C语言宏定义中的特殊用法
C宏定义中的特殊用法 在分析一些C源码时,经常会遇到各种宏定义操作,本文即总结一下C语言宏定义中常见的预定义宏.调试宏:宏的条件编译用法及特殊的宏关键字用法. #undef 限定宏的作用域 一般来讲宏 ...
- do...while(0)在宏定义中的巧妙用法
大家都知道,do-while(condition)可以表示循环,但你有没有遇到在一些宏定义中可以不用循环的地方,也用到了 do-while.比如: #define DELETE_POINTER(p) ...
- #define宏定义中的#,##,@#,\ 这些符号的神奇用法
C/C++ 宏命令的神奇用法. 先看下面三条语句: #define Conn(x,y) x##y #define ToChar(x) #@x #define ToString(x) #x 1 2 3 ...
- C宏定义中的##,#,#@用法介绍
关于字符串化和符号粘贴 2011-08-02 16:52:46.0 来源:博客园 作者:佚名 关键词: 字符串 C++ 在C语言开发中,宏定义是一个非常有用的工 ...
- 空的宏定义作用及常见用法
空的宏定义作用及常见用法 我们学习宏定义的第一个概念是,宏定义作为替换作用. 例如: #define SIZE 32 // 接下来代码使用SIZE就相当于32 宏定义是编译器在编译时,将程序中所有SI ...
- 宏定义Define的一些用法
---转载百度文库 一. #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处 ...
- 宏定义中的 ## ... __VA_ARGS__
宏定义中的##操作符和... and _ _VA_ARGS_ _ 1.Preprocessor Glue: The ## Operator 预处理连接符:##操作符 Like the # operat ...
- #与##在宏定义中的--宏展开
#与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a) #a #define h(a) g(a) int m ...
- define宏定义中的#,##,@#及\符号
define宏定义中的#,##,@#及\符号 在#define中,标准只定义了#和##两种操作.#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串. 1.# (string ...
最新文章
- java ftp client_JAVA FTP CLIENT
- json例子(后台取消息)
- python图片-Python图像处理
- Spring Boot 配置文件 yml与properties
- 在ASP.NET AJAX中使用应用程序服务和本地化(3):用户个性化组件ProfileService
- android 5.1 raw,升级安卓5.1 三星S6/S6 edge将支持RAW
- (持续更新)webstorm快捷键及术语翻译
- 通过批处理调用SQL*Plus执行批量脚本
- 校园天翼客户端常见错误码
- 如何编写Firefox扩展
- java设计模式——adapter模式
- 谈谈我对证券公司一些部门的理解(前、中、后台)
- 10003 微信登录失败 redirect_uri域名与后台配置不一致
- SSM Chapter 12 SpringMVC扩展和SSM框架整合
- win7 bcdedit
- 学习如何使用html和css样式将两张图片叠加到另一张图片上,实现微信扫一扫二维码效果
- 【pytorch】tnn
- 数据集划分函数sklearn.model_selection.train_test_split参数详解
- 什么是C语言?到底难不难学?——新手问题篇
- 笔记本获取服务器上的文件,win7笔记本读取服务器里的文件肿么弄???
热门文章
- 如何共享计算机磁盘,扩展群集共享磁盘的分区 - Windows Server | Microsoft Docs
- fiddler弱网测试_用fiddler实现弱网测试
- idea自动整理代码快捷键_MDK进阶使用教程,快捷启动任意软件,自动整理格式化代码,方便代码整理可以很好 的提高效率...
- python私有成员与公有成员_Python访问限制私有还是公有的介绍(附示例)
- java实验三多态性_Java实验3 类的多态性和接口
- 深度相机(七)--体感设备对比
- 高中信息技术——进制与编码刷题点整理
- 记安卓屏固件升级步骤
- 计算机网络常用术语WWW,计算机网络常用术语
- 一小时精通SVN版本控制 之五 团队协作开发