C语言中宏定义"#"和"##"符号的用法.doc
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
在C语言中,宏定义是预处理器的一种特性,它允许我们创建代换文本,从而简化代码或实现特定功能。在宏定义中,“#”和“##”是两个特殊的符号,它们各自有不同的用途。 1. “#”(双引号)符号: 这个符号被称为“字符串化”操作符。当“#”放在宏参数前时,宏展开时会将参数转换为一个字符串字面量。例如,在`STR(s)`宏定义中,如果传入参数`vck`,则`STR(vck)`会被替换为字符串字面量`"vck"`。在示例中,`printf(STR(vck))`将输出字符串"vck"。 2. “##”(双井号)符号: 这个符号称为“拼接”或“连接”操作符。它用于将两个宏参数连接成一个单一的标识符。在`CONSS(a, b)`的宏定义中,`##`将`a`和`b`连接在一起形成新的标识符,如`2e3`。在示例中,`printf("%d\n", CONSS(2,3))`将输出整数2000,因为`CONSS(2,3)`被解析为`(int)2e3`,其中`e`在这里表示指数运算符,等价于2乘以10的3次方。 3. 宏参数是另一个宏: - 当宏参数不是`#`或`##`时,例如`MUL(a, b)`,宏参数会在使用之前完全展开。所以,`MUL(TOW, TOW)`会先展开`TOW`,然后进行计算,得到`(2)*(2)`。 - 当有`#`或`##`时,宏参数不会被进一步展开。例如,`STR(INT_MAX)`会将`INT_MAX`作为一个整体转换为字符串`"INT_MAX"`,而不是将其展开为数值`0x7fffffff`。 解决宏参数不展开的问题,可以引入一层转换宏,如`_STR(s)`和`STR(s)`,以及`_CONSS(a, b)`和`CONSS(a, b)`。这样,转换宏内的宏参数会被先展开,然后再应用`#`或`##`操作。 4. 特殊应用: - 匿名变量名的合并:`___ANONYMOUS1`和`__ANONYMOUS0`宏通过`##`连接变量名和行号,创建一个在当前源代码行唯一的匿名变量,如`static int _anonymous70`。 - 填充结构:`FILL(a)`宏可以用来创建结构体成员,如`enum IDD{OPEN, CLOSE}`,可以使用`FILL(OPEN)`创建`{OPEN, "OPEN"}`这样的结构体成员,其中`#a`将`a`转换为字符串。 总结来说,C语言中的`#`和`##`符号是宏定义中的重要工具,它们分别用于字符串化和拼接操作,使得宏定义能处理更复杂的文本替换,包括生成唯一的变量名和结构体填充等高级应用场景。理解和熟练运用这两个符号,能够帮助开发者编写更灵活和高效的C程序。
- 粉丝: 87
- 资源: 2万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助