`
bollaxu
  • 浏览: 219515 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

宏中"#"和"##"的用法

 
阅读更多

宏中"#"和"##"的用法  


一、一般用法  
我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.  
用法:

#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语言宏中#和##的用法[文].pdf

    C 语言宏中 "#" 和 "##" 的用法是非常重要的,特别是在查看 Linux 内核源码的过程中,这两种符号经常被使用。下面我们将从一般用法、宏参数展开、应用特例三个方面来详细讲解这两种符号的用法。 一、一般用法 在 C...

    [c、c++]宏中#和##的用法(zz).docx

    宏中的`#`和`##`运算符具有特殊的用途,它们在处理宏参数时起到关键作用。 `#`运算符被称为“字符串化”运算符。当`#`前面是一个未展开的宏参数时,它会将这个参数转换为一个字符串字面量。例如,在`#s`的宏定义`...

    DSP中CSL头文件中宏中#和##的用法介绍

    在数字信号处理(DSP)领域,常常需要使用到C语言扩展的预处理器宏来实现代码的复用和灵活配置...在学习和使用DSP中的CSL库时,深入理解这两个运算符的用法可以帮助我们更有效地利用这些库,提高代码的效率和可维护性。

    宏定义中#,#@,##的用法.docx

    在`CONS(a,b)`宏中,`##`将`a`和`e`以及`e`和`b`连接起来,形成一个新的标识符,如`2e3`。如果`a`是`2`,`b`是`3`,`macro(x,y)`就会生成`int(2e3)`,最终结果是`2000`。 3. `#@`: 这个运算符在C标准中并不常见,...

    如何在C语言的宏中使用类型关键字

    如下所示: 代码如下:// 在C语言的宏中使用类型关键字#include &lt;stdio&gt;#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宏中的命令

    总的来说,熟练掌握查找和使用Word宏命令的技巧,不仅能够帮助你节省时间,还能让你在处理大量文本工作时更加得心应手。记得在使用宏时要注意数据安全,避免运行来源不明的宏,以免引入病毒或恶意软件。同时,定期...

    C语言中##的用法总结

    `#`和`##`是预处理器宏中的两个特殊操作符,它们有着特定的用途。 首先,`#`操作符用于将宏参数转换为字符串字面量。在宏定义中,如果`#`操作符紧跟在一个宏参数后面,当宏被展开时,这个参数将被替换为对应的字符...

    word用法技巧

    在“查找和替换”功能中,使用半角^l(小写L)作为查找内容,空内容作为替换内容,可以批量删除换行符。 #### 九、选择性删除最近使用文件列表 通过修改“工具”菜单下的“选项”设置,可以控制“文件”菜单中最近...

    ANSYS-APDL编程指南

    #### 4.7 在宏中使用_STATUS和_RETURN参数 介绍了如何利用`_STATUS`和`_RETURN`参数来实现宏之间的通信。 ### 第五章:GUI用户界面 #### 5.1 提示用户输入某个参数的值 当需要用户输入特定参数值时,可以使用GUI...

    c语言中的#的作用.pdf

    在预处理指令中,我们可以使用sizeof运算符来计算类型或变量的大小,并且在宏中使用#来将类型名称转换为字符串。例如,TYPE_BUF_SIZE宏就可以将传入的类型名称转换为其字符串形式,并计算大小。 11. 字符串复制宏:...

    FreeMarker页面制作规范

    #### 项目中常用宏的使用方法 - **基本用法**: ```freemarker &lt;#macro greet&gt; &lt;div&gt;Hello Joe! &lt;/#macro&gt; ``` 调用方式为 `&lt;@greet /&gt;` 或 `&lt;@greet&gt;&lt;/@greet&gt;`。 - **带参数的宏**: ```freemarker &lt;#...

    gcc扩展用法gcc扩展用法

    此外,为了确保`x`和`y`的类型相同,宏中还包含了`(void)(&_x == &_y)`这一语句。最终,宏返回`x`和`y`中的较小值。 #### 零长度数组 GCC支持零长度数组的概念,这对于定义动态长度的数据结构非常有用。零长度数组...

    C语言文件操作、预处理器和宏课件.md

    ### C语言文件操作、预处理器和宏课件知识点解析 #### 文件操作 ##### 打开文件 在C语言中,`fopen`函数用于打开一个文件。它接收两个参数:第一个参数...通过理解和掌握这些概念,可以更加高效地使用C语言进行编程。

    define用法-C语言.pdf

    本文将详细解释多种#define用法,并展示如何使用这些预处理宏。 1. 定义常量 #define用于定义常量是其最简单的应用之一。常量宏通常全大写,以示区别。 ```c #define MAXTIME 1000 ``` 此代码段将创建一个名为...

    Metagraphics C Coding Guide

    - **避免使用 Microsoft 和 ANSI 名称**:尽量不要使用类似 `_begin` 或 `strncpy` 这样的名称,以免与标准库冲突。 - **C 应用程序函数**:使用简洁明了的名称,如 `initialize`, `process`, `terminate` 等。 - **...

    Zemax问题集11

    对于这些命令的具体使用方法和语法格式,建议查阅Zemax手册中的“Chapter22 ZEMAX PROGRAMMING LANGUAGE ZPL keywords GOSUB, SUB, RETURN, and END”。这部分文档详细介绍了这些命令的功能及使用场景,可以帮助更好...

    SAS统计软件教程

    ### SAS统计软件教程知识点概述 #### 一、SAS简介与基本操作 ##### 1.1 SAS概述 ...通过以上内容的学习,读者可以全面掌握SAS统计软件的基本使用方法及高级编程技巧,为进一步的数据分析工作打下坚实的基础。

Global site tag (gtag.js) - Google Analytics