C语言 #和##的用法
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 输出:2000return 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))
C语言 #和##的用法相关推荐
- Go语言MD5加密用法实例
Go语言MD5加密用法实例 本文实例讲述了Go语言MD5加密用法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: import ( "crypto/md5" ...
- C语言atoi()函数用法
C语言atoi()函数用法 头文件:#include <stdlib.h> atoi() 函数用来将字符串转换成整数(int),其原型为: int atoi (const char * s ...
- 6s在c语言中的用法,C语言中assert的用法讲解
assert是指编写代码时做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.下面是小编为大家整理的C语言assert的用法讲解,欢迎参考~ assert宏的原型定 ...
- ASP脚本语言之vbscript用法
常用的脚本语言有 Javascript 和 VBscript . 使用哪种语言需先设定.如上节代码中的<%@ LANGUAGE="JSCRIPT" ... %> ...
- C 语言do with,中考英语易错题十七、语言交际的用法
十七.语言交际的用法 [中考链接] -Do you mind if I record your lecture? -__________. Go ahead. A. Never mind B. No ...
- java 泛化_Java语言class类用法及泛化(详解)
这篇文章主要介绍了Java语言class类用法及泛化(详解),大家都知道Java程序在运行过程中,对所有的对象进行类型标识,也就是RTTI.这项信息记录了每个对象所属的类.虚拟机通常使用运行时类型信息 ...
- fclose在c语言中的作用,c语言fcloseall函数用法实例介绍
c语言fcloseall函数用法实例介绍.fcloseall函数的返回值,函数 fcloseall() 将所有打开的流与其底层的文件或功能集合关闭.任何缓冲的数据都将首先被写入,使用 fflush(3 ...
- C语言 qsort的用法 模拟EXCEL排序
C语言 qsort的用法 模拟EXCEL排序 题目 Excel可以对一组记录按任意指定列排序.现请编写程序实现类似的功能. 输入 输入的第一行包含两个正整数N(<= 10^5)和C,其中N是记录 ...
- c语言关于break的程序,c语言break的用法
小编为大家整理了c语言break的用法.希望对你有帮助哦! 一.程序源代码: #include void main() { char letter; printf("please input ...
- c语言写程序if else,if else用法详解,C语言if else用法完全攻略
if else 语句是一种选择结构,可以让代码选择执行.所谓选择执行,就是"某些代码可能执行,也可能不执行,有选择地执行某些代码". if 的最简单用法 if最简单的格式是: if ...
最新文章
- 从时间管理聊到技术人如何保持竞争力?
- css图片和文字一样高,css里图片和文字如何等高
- shiro+redis实现session共享
- 029_CSS水平对齐
- C# 弹出确定、取消窗口
- Android之使用ACTION_USAGE_ACCESS_SETTINGS权限检测手机多少天没有未使用其它APP
- 【Pytorch神经网络理论篇】 31 图片分类模型:ResNet模型+DenseNet模型+EffcientNet模型
- Step By Step 搭建 MySql MHA 集群
- Hibernate Validator JSR303示例教程
- Java™ 教程(常见问题及其解决方案)
- 时域上的乘积等于频域上的卷积_时频域分析的一些常用概念补充(线性时不变系统、卷积、冲激响应、窗函数等)...
- 【设计模式】建造者模式(生成器模式)
- MySQL出现Waiting for table metadata lock的场景浅析
- ARM开发7.3.3 基础实训( 3 ) 独立式键盘的输入系统设计--LPC21XX
- 含论文答辩PPT任务书源码等基于SSM框架演唱会网上订票系统
- 漂白android软件,原本图片漂白软件
- 全角字符空格(可复制使用)
- 【2022年华为杯数学建模E题赛后总结加思路详细介绍配代码----10月11号写的总结】
- 【干货】BIOS、UEFI、MBR、GPT、GRUB 到底是什么意思?
- ST-GAN: Spatial Transformer Generative Adversarial Networks for Image Compositing 原文翻译