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语言 #和##的用法相关推荐

  1. Go语言MD5加密用法实例

    Go语言MD5加密用法实例 本文实例讲述了Go语言MD5加密用法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: import (     "crypto/md5" ...

  2. C语言atoi()函数用法

    C语言atoi()函数用法 头文件:#include <stdlib.h> atoi() 函数用来将字符串转换成整数(int),其原型为: int atoi (const char * s ...

  3. 6s在c语言中的用法,C语言中assert的用法讲解

    assert是指编写代码时做出一些假设,断言就是用于在代码中捕捉这些假设,可以将断言看作是异常处理的一种高级形式.下面是小编为大家整理的C语言assert的用法讲解,欢迎参考~ assert宏的原型定 ...

  4. ASP脚本语言之vbscript用法

    常用的脚本语言有 Javascript 和 VBscript . 使用哪种语言需先设定.如上节代码中的<%@ LANGUAGE="JSCRIPT"   ...    %> ...

  5. C 语言do with,中考英语易错题十七、语言交际的用法

    十七.语言交际的用法 [中考链接] -Do you mind if I record your lecture? -__________. Go ahead. A. Never mind B. No ...

  6. java 泛化_Java语言class类用法及泛化(详解)

    这篇文章主要介绍了Java语言class类用法及泛化(详解),大家都知道Java程序在运行过程中,对所有的对象进行类型标识,也就是RTTI.这项信息记录了每个对象所属的类.虚拟机通常使用运行时类型信息 ...

  7. fclose在c语言中的作用,c语言fcloseall函数用法实例介绍

    c语言fcloseall函数用法实例介绍.fcloseall函数的返回值,函数 fcloseall() 将所有打开的流与其底层的文件或功能集合关闭.任何缓冲的数据都将首先被写入,使用 fflush(3 ...

  8. C语言 qsort的用法 模拟EXCEL排序

    C语言 qsort的用法 模拟EXCEL排序 题目 Excel可以对一组记录按任意指定列排序.现请编写程序实现类似的功能. 输入 输入的第一行包含两个正整数N(<= 10^5)和C,其中N是记录 ...

  9. c语言关于break的程序,c语言break的用法

    小编为大家整理了c语言break的用法.希望对你有帮助哦! 一.程序源代码: #include void main() { char letter; printf("please input ...

  10. c语言写程序if else,if else用法详解,C语言if else用法完全攻略

    if else 语句是一种选择结构,可以让代码选择执行.所谓选择执行,就是"某些代码可能执行,也可能不执行,有选择地执行某些代码". if 的最简单用法 if最简单的格式是: if ...

最新文章

  1. 从时间管理聊到技术人如何保持竞争力?
  2. css图片和文字一样高,css里图片和文字如何等高
  3. shiro+redis实现session共享
  4. 029_CSS水平对齐
  5. C# 弹出确定、取消窗口
  6. Android之使用ACTION_USAGE_ACCESS_SETTINGS权限检测手机多少天没有未使用其它APP
  7. 【Pytorch神经网络理论篇】 31 图片分类模型:ResNet模型+DenseNet模型+EffcientNet模型
  8. Step By Step 搭建 MySql MHA 集群
  9. Hibernate Validator JSR303示例教程
  10. Java™ 教程(常见问题及其解决方案)
  11. 时域上的乘积等于频域上的卷积_时频域分析的一些常用概念补充(线性时不变系统、卷积、冲激响应、窗函数等)...
  12. 【设计模式】建造者模式(生成器模式)
  13. MySQL出现Waiting for table metadata lock的场景浅析
  14. ARM开发7.3.3 基础实训( 3 ) 独立式键盘的输入系统设计--LPC21XX
  15. 含论文答辩PPT任务书源码等基于SSM框架演唱会网上订票系统
  16. 漂白android软件,原本图片漂白软件
  17. 全角字符空格(可复制使用)
  18. 【2022年华为杯数学建模E题赛后总结加思路详细介绍配代码----10月11号写的总结】
  19. 【干货】BIOS、UEFI、MBR、GPT、GRUB 到底是什么意思?
  20. ST-GAN: Spatial Transformer Generative Adversarial Networks for Image Compositing 原文翻译

热门文章

  1. 漫谈GUI开发—各种平台UI开发概况
  2. FileReader读取本地文件
  3. CentOS下Vim编辑器的使用
  4. 机器学习:LibSVM与weka在eclipse中的使用
  5. Android -- Exif
  6. Android布局详解(二)
  7. 【UIKit】键盘设计2
  8. 木马的隐藏及其启动方式 (转)
  9. 思科CCNA考试命令集总结
  10. 14.卷1(套接字联网API)---高级IO函数