宏定义中 ## 和 # 的作用

宏定义中 ## 和 # 的作用

 

## 相当于一个连接符号,用于把参数连在一起

#define FUNC1(name)    name##__
#define FUNC2(message) HANDLE_##message
FUNC1(HINSTANCE);     // return "HINSTANCE__"
FUNC2(WM_INITDIALOG); // return "HANDLE_WM_INITDIALOG"

#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
DECLARE_HANDLE(HINSTANCE);
// 等同于
// struct HINSTANCE__
// {
//      int unused;
// };
// typedef struct HINSTANCE__ *HINSTANCE;

# 是"字符串化"的意思。出现在宏定义中的 # 是把跟在后面的参数转换成一个字符串。

#define STRCPY(dst, src) strcpy(dst, #src)
STRCPY(buff, abc); // return strcpy(buff,"abc");


此外,带有 # 与 ## 参数的本身也是一个宏的话,则这个宏将不会被展开 。

#define _STR(s)    #s

printf("int max: %s\n", _STR(INT_MAX)); // INT_MAX need #include <climits>
// 等同:printf("int max: %s\n", "INT_MAX");
// INT_MAX 将不会被展开,而返回:
// int max: INT_MAX

// 如果加一层中间转换宏.
#define _STR(s)     #s
#define  STR(s)     _STR(s) // 转换宏

printf("int max: %s\n", STR(INT_MAX));
//  STR(INT_MAX)    先展开成   _STR(2147483647)
// _STR(2147483647) 然后再展开 "2147483647"
// 最后返回
// int max: 2147483647 (0x7fffffff)

 

几个例子

#define A1(name, type) type name_##type##_type
#define A2(name, type) type name##_##type##_type

A1(a1, int); // 等价于: int name_int_type;
A2(a1, int); // 等价于: int a1_int_type;

// 在第一个宏定义中,"name"和第一个"_"之间,以及第2个"_"和第二个"type"之间没有被分隔,
// 所以预处理器会把name_##type##_type解释成3段:“name_”、“type”、以及“_type”,
// 这中间只有“type”是在宏前面出现过的,所以它可以被宏替换。
// 
// 而在第二个宏定义中,“name”和第一个“_”之间也被分隔了,所以预处理器会把
// name##_##type##_type解释成4段:“name”、“_”、“type” 以及 “_type”,这其间,
// 就有两个可以被宏替换了。

#define A1(name, type) type name_ ##type ##_type // ##前面随意加上一些空格
#define A2(name, type) type name ##_ ##type ##_type
// 结果是## 会把前面的空格去掉完成强连接,得到和上面结果相同的宏定义。

// 单独的一个 #
// 至于单独一个#,则表示 对这个变量替换后,再加双引号引起来。比如
// #define __stringify_1(x) #x
// 那么
// __stringify_1(linux) <==> __stringify_1("linux")

void fnName_1(int inumber)
{
    cout<<"1: "<<inumber<<endl;
}
void fnName_2(int inumber)
{
    cout<<"2: "<<inumber<<endl;
}
#define FNNAME(suffix,param) fnName_##suffix(param)
FNNAME(1,2); // 等价于 fnName_1(2);
FNNAME(2,2); // 等价于 fnName_2(2);

 

参考:

https://www.cnblogs.com/yinheyi/p/5971614.html
       https://www.cnblogs.com/Acg-Check/p/4268645.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值