博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++ 的宏中#和##的作用和展开
阅读量:5460 次
发布时间:2019-06-15

本文共 2168 字,大约阅读时间需要 7 分钟。

C/C++ 的宏中:

  (1) # 的功能是将其后面的宏参数行字符串化操作,简单说就是在对它所引用宏变量通过替换后在其左右各加上一个双引号。

  也就是说:

  #define __TO_STRING_IMPL(x) #x

  中的#X, 则宏变量X所引用的是宏参数中的X,因为,#X会直接对参数X进行字符串化,因此该参数输出的是字符串“X”。

  使用: __TO_STRING_IMPL(15), 输出:“15”

 

  为了能够进一步增加宏的参数输入,因此需要在外部再包括一个宏转化,这样就可以把"转化宏"中的具体参数传入到参数化宏中,这样就可以变为相应“具体参数”的字符串。

  如下图所示:

  #define __TO_STRING(x) __TO_STRING_IMPL(x)

 

  (2) ##连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。

  作用:只是用所引用的宏变量替换后,将两个字符串串接起来,形成新的字符串。

  如下:

  #define A(x) T_##x

  使用:A(1),则输出:T_1

  

  (3)#@, 表示将参数作为字符形式替换

  如下:

  #define B(x) #@x

  使用: B(1),输出:’1‘

 

 

凡是宏定义里有用#或##的地方宏参数是不会再展开,例如_STRI(INT_MAX)中的INT_MAX就不会被展开为2147483647。  

如果想要使其中的宏参数展开,则需要多加一层中间转换宏: #define STRI(s) _STRI(s)  

加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里的就能得到对应的宏参数

  

#ifndef __TO_STRING#define __TO_STRING_IMPL(x) #x #define __TO_STRING(x) __TO_STRING_IMPL(x)#endif

 

  例子如下:

#include "stdafx.h"#include 
#include
using namespace std;#define f(a,b) a##b#define g(a) #a#define h(a) g(a)#define A(x) T_##x#define B(x) #@x#define C(x) #x//如果EXP为真, 则输出宏参数“EXP”所指的字符串,//注意:参数直接用真实参数替换。#define WARN_IF(EXP) if(EXP) cerr << #EXP << endl;//将红参数“n”,真实参数替换后#define paster( n ) cout << "token" << #n << " = " << n << endl;//两个宏参数,连接“宏参数”替换后形成字符串#define _CONS(a, b) int(a##+##b)#define _STRI(s) #s#define STRI(s) _STRI(s)void test_sharp_symbol(){ printf("%s\n", h(f(1, 2))); //输出:12 因为:h是转化的宏,其参数还是一个宏变量,则需要转化。 printf("%s\n", g(f(1, 2))); //输出:f(1,2) 因为:g直接把指代的参数以“字符串”输出 printf("%s\n", h(A(1))); // A(1)------〉T_1 printf("%d\n", B(1)); // B(1)------〉'1' printf("%s\n", C(1)); // C(1)------〉"1" int div = 0; WARN_IF(div == 0); //输出: div == 0 paster(9); //输出: token9 = 9 cout << _CONS(1 + 2, 2) << endl; //输出: 5 , 即: int(3+2), 输出5 cout << _STRI(INT_MAX) << endl; //输出: INT_MAX ,因为INT_MAX,本质上是一个宏,但是作为宏参数,则直接以字符串输出。 cout << STRI(INT_MAX) << endl; // prints : 2147483647 因为: INT_MAX ,再 STRI中已经替换为真实“数据”,从而可以以字符串输出}int _tmain(int argc, _TCHAR* argv[]){ test_sharp_symbol(); system("pause"); return 0;}

输出如下:

 

 

转载于:https://www.cnblogs.com/icmzn/p/10147237.html

你可能感兴趣的文章
Sharepoint2013商务智能学习笔记之Performancepoint service 配置(九)
查看>>
微信小程序-视图列表渲染
查看>>
CentOS中用户不在 sudoers 文件中。此事将被报告。
查看>>
p38 二、八、十六进制的对应关系
查看>>
Effective C++笔记——day01
查看>>
P4302 [SCOI2003]字符串折叠
查看>>
神秘的程序员
查看>>
jS 中创建对象:
查看>>
zless轻量级样式框架
查看>>
ZeroMQ接口函数之 :zmq_term - 终结ZMQ环境上下文(context)
查看>>
js获取倒计时
查看>>
loadrunner安装过程中的,注册表问题
查看>>
git push失败the remote end hung up unexpectedly
查看>>
POJ3087 Shuffle'm Up 简单模拟
查看>>
Django中数据的增删改查
查看>>
iOS模拟器发生了崩溃,去哪找Crash Log
查看>>
[支付宝]即时到账接口对接总结
查看>>
夺命雷公狗-----React---15--三元运算符
查看>>
元首的愤怒 SharePoint Apps
查看>>
CSS
查看>>