宏定义中的#@与#

宏定义中的#、#@与##

有些用法一般的C语言书籍中没有,但确实存在,如宏定义中的#、#@与##,说明如下:

1、#
为后面的宏形参添加双引号。
例:
#define SINGLESHARP(arg) #arg
SINGLESHARP(singlesharp) <==> "singlesharp"
2、#@
为后面的宏形参添加单引号。
例:
#define SINGLESHARPWITHAT(arg) #@arg
SINGLESHARPWITHAT(@) <==> '@'
3、##
连接##前后的两个宏形参。
具体的过程(为方便认知,主观认为如此,实际过程并非如此):
1)用空格替代##,则可以把宏分成几段,每段和宏形参比较,如果是宏形参,就用相应的实参替换;
2)去掉所有空格,连接这些段。
例:
#define A1(name, type)   type name_##type##_type
A1(a1, int);
步骤1,变为
type、name_、type、_type 四段,用实参替换,得到:int、name_、int、_type(注意name_和type_和前面面的形参并不符,所以没有替换);
步骤2,得到
int name_int_type;
-------------------------------------------
#define A2(name, type)   type name##_##type##_type
A2(a1, int);
步骤1,变为
type、name、_ 、type 、_type 五段,用实参替换,得到:int、a1、_、int、_type(注意和上面的例子对比);
步骤2,得到
int a1_int_type;
-------------------------------------------
验证##的去空格连接特性:
<##前后随意加上一些空格>
#define A1(name, type)   type name_   ##type ##_type 
#define A2(name, type)   type name ##_ ##type ##_type
结果是## 会把前后的空格去掉完成强连接,得到和上面结果相同的宏定义。