宏中"#"和"##"的用法
一、一般用法
我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.
用法:
#include<cstdio>
#include<climits>
using namespace std;
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
int main()
{
printf(STR(vck)); // 输出字符串"vck"
printf("%d ", CONS(2,3)); // 2e3 输出:2000
return 0;
}
二、当宏参数是另一个宏的时候
需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开.
1, 非'#'和'##'的情况
#define TOW (2)
#define MUL(a,b) (a*b)
printf("%d*%d=%d ", TOW, TOW, MUL(TOW,TOW));
这行的宏会被展开为:
printf("%d*%d=%d ", (2), (2), ((2)*(2)));
MUL里的参数TOW会被展开为(2).
2, 当有'#'或'##'的时候
#define A (2)
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
printf("int max: %s ", STR(INT_MAX));// INT_MAX #include<climits>
这行会被展开为:
printf("int max: %s ", "INT_MAX");
INT_MAX和A都不会再被展开, 然而解决这个问题的方法很简单. 加多一层中间转换宏.
加这层宏的用意是把所有宏的参数在这层里全部展开, 那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数.
#define A (2)
#define _STR(s) #s
#define STR(s) _STR(s) // 转换宏
#define _CONS(a,b) int(a##e##b)
#define CONS(a,b) _CONS(a,b) // 转换宏
printf("int max: %s ", STR(INT_MAX));// INT_MAX,int型的最大值,为一个变量 #include<climits>
输出为: int max: 0x7fffffff
STR(INT_MAX) --> _STR(0x7fffffff) 然后再转换成字符串;
printf("%d ", CONS(A, A));
输出为:200
CONS(A, A) --> _CONS((2), (2)) --> int((2)e(2))
分享到:
相关推荐
C 语言宏中 "#" 和 "##" 的用法是非常重要的,特别是在查看 Linux 内核源码的过程中,这两种符号经常被使用。下面我们将从一般用法、宏参数展开、应用特例三个方面来详细讲解这两种符号的用法。 一、一般用法 在 C...
宏中的`#`和`##`运算符具有特殊的用途,它们在处理宏参数时起到关键作用。 `#`运算符被称为“字符串化”运算符。当`#`前面是一个未展开的宏参数时,它会将这个参数转换为一个字符串字面量。例如,在`#s`的宏定义`...
在数字信号处理(DSP)领域,常常需要使用到C语言扩展的预处理器宏来实现代码的复用和灵活配置...在学习和使用DSP中的CSL库时,深入理解这两个运算符的用法可以帮助我们更有效地利用这些库,提高代码的效率和可维护性。
在`CONS(a,b)`宏中,`##`将`a`和`e`以及`e`和`b`连接起来,形成一个新的标识符,如`2e3`。如果`a`是`2`,`b`是`3`,`macro(x,y)`就会生成`int(2e3)`,最终结果是`2000`。 3. `#@`: 这个运算符在C标准中并不常见,...
如下所示: 代码如下:// 在C语言的宏中使用类型关键字#include <stdio>#define PRINT_AS_TYPE(i,TYPE) printf(“%d “, (TYPE)i) int main(int argc, char *argv[]){ float x= 9; PRINT_AS_TYPE(x, int); return...
总的来说,熟练掌握查找和使用Word宏命令的技巧,不仅能够帮助你节省时间,还能让你在处理大量文本工作时更加得心应手。记得在使用宏时要注意数据安全,避免运行来源不明的宏,以免引入病毒或恶意软件。同时,定期...
`#`和`##`是预处理器宏中的两个特殊操作符,它们有着特定的用途。 首先,`#`操作符用于将宏参数转换为字符串字面量。在宏定义中,如果`#`操作符紧跟在一个宏参数后面,当宏被展开时,这个参数将被替换为对应的字符...
在“查找和替换”功能中,使用半角^l(小写L)作为查找内容,空内容作为替换内容,可以批量删除换行符。 #### 九、选择性删除最近使用文件列表 通过修改“工具”菜单下的“选项”设置,可以控制“文件”菜单中最近...
#### 4.7 在宏中使用_STATUS和_RETURN参数 介绍了如何利用`_STATUS`和`_RETURN`参数来实现宏之间的通信。 ### 第五章:GUI用户界面 #### 5.1 提示用户输入某个参数的值 当需要用户输入特定参数值时,可以使用GUI...
在预处理指令中,我们可以使用sizeof运算符来计算类型或变量的大小,并且在宏中使用#来将类型名称转换为字符串。例如,TYPE_BUF_SIZE宏就可以将传入的类型名称转换为其字符串形式,并计算大小。 11. 字符串复制宏:...
#### 项目中常用宏的使用方法 - **基本用法**: ```freemarker <#macro greet> <div>Hello Joe! </#macro> ``` 调用方式为 `<@greet />` 或 `<@greet></@greet>`。 - **带参数的宏**: ```freemarker <#...
此外,为了确保`x`和`y`的类型相同,宏中还包含了`(void)(&_x == &_y)`这一语句。最终,宏返回`x`和`y`中的较小值。 #### 零长度数组 GCC支持零长度数组的概念,这对于定义动态长度的数据结构非常有用。零长度数组...
### C语言文件操作、预处理器和宏课件知识点解析 #### 文件操作 ##### 打开文件 在C语言中,`fopen`函数用于打开一个文件。它接收两个参数:第一个参数...通过理解和掌握这些概念,可以更加高效地使用C语言进行编程。
本文将详细解释多种#define用法,并展示如何使用这些预处理宏。 1. 定义常量 #define用于定义常量是其最简单的应用之一。常量宏通常全大写,以示区别。 ```c #define MAXTIME 1000 ``` 此代码段将创建一个名为...
- **避免使用 Microsoft 和 ANSI 名称**:尽量不要使用类似 `_begin` 或 `strncpy` 这样的名称,以免与标准库冲突。 - **C 应用程序函数**:使用简洁明了的名称,如 `initialize`, `process`, `terminate` 等。 - **...
对于这些命令的具体使用方法和语法格式,建议查阅Zemax手册中的“Chapter22 ZEMAX PROGRAMMING LANGUAGE ZPL keywords GOSUB, SUB, RETURN, and END”。这部分文档详细介绍了这些命令的功能及使用场景,可以帮助更好...
### SAS统计软件教程知识点概述 #### 一、SAS简介与基本操作 ##### 1.1 SAS概述 ...通过以上内容的学习,读者可以全面掌握SAS统计软件的基本使用方法及高级编程技巧,为进一步的数据分析工作打下坚实的基础。