宏定义中 ## 和 # 的作用
## 相当于一个连接符号,用于把参数连在一起
#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