#define的预处理运算符##,#,#@

在代码中的宏定义里,无意看到了##的使用,查资料发现这种预处理运算符。

## 表示连接

#include <iostream>
using namespace std;

#define Connect(x,y) x##y

void func1()
{
    cout<<"func1"<<endl;
}
int num1=1;

int main() {
    Connect(func,1)();
    cout<<Connect(num,1)<<endl;
    return 0;
}
输出:
func1
1

注:
(1)##前后的空格可有可无,不会影响实际拼接的效果
(2)连接后的实际参数名需要有意义,需要已经被定义
(3)如果##后的参数本身也是一个宏的话,则会被阻止展开

多层宏定义展开的规则:
一般而言,从内层到外层依次展开宏;
但是,如果外层宏展开后有#或##运算符,则不对其内层的宏做展开。这种情况下,应该将代有#或##操作的宏放入最内层,要么在这样的宏外面再包裹一层,并且调用包裹后的宏。----宏展开感觉也可以继续再研究一下。

# 表示字符串化(将传入的参数名转化成字符串,加双引号)

#define example(instr) #instr

string str=example(abc);//将会展开成 string str="abc";

注:
(1)参数前后的空格不对转换产生影响
(2)参数内部的空格,则会存在于转换后的字符串中

#include <iostream>
using namespace std;

#define example1(a) #a

int main() {
    string x=example1( 10 01);
    cout<<x<<endl;
    return 0;
}
输出:
10 01

#@ 表示字符化(将传入的单字符参数名转化成字符,加单引号)

#define example2(x) #@x
char a=example2(b);//将会展开成 char a='b';

注:
(1)使相应的参数括在单引号中,并被视为一个字符( Microsoft 特定 ),GCC/G++无此运算符。
(2)参数需要时一个字符,多了会出现错误或编译失败。

很好的参考文章:
深入理解#define预处理,预处理器运算符# ## #@

宏展开的步骤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值