`
fp_moon
  • 浏览: 977795 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

阅读更多

有些用法一般的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
结果是## 会把前后的空格去掉完成强连接,得到和上面结果相同的宏定义。

分享到:
评论

相关推荐

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

    宏定义中的`#`, `#@`, 和 `##` 是特殊的运算符,它们有着特定的用途。 首先,`#` 运算符被称为“字符串化”运算符。它将宏参数转换为一个双引号包围的字符串字面量。例如,如果有一个宏 `#define macro(a) #a`,当...

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

    在宏定义中,`#`, `##` 和 `#@` 是特殊的运算符,它们有着特定的用途。以下是这些运算符的详细解释: 1. `#`(字符串化): 当`#`放在宏参数前时,它会使宏参数在展开时被转换为一个字符串字面量。例如,在`#...

    C语言宏定义##连接符和#符的使用

    ### C语言宏定义中的##连接符和#符详解 在C语言编程中,宏定义是一种常用的预处理功能,它能够帮助开发者实现代码的简化、复用以及特定逻辑的快速构建。本文将详细介绍C语言宏定义中两个特殊符号的使用:连接符`##`...

    C语言宏定义中#与##运算符

    ### C语言宏定义中#与##运算符详解 #### 一、引言 在C语言中,宏定义是一种非常强大的工具,它可以帮助程序员简化代码、提高编程效率。宏定义不仅支持简单的文本替换,还提供了两个特殊的运算符:`#` 和 `##`。...

    ##与#在宏定义中的作用

    在C语言中,宏定义是一种预处理指令,用于在编译之前替换文本。`##`和`#`是两个特殊的运算符,它们在宏定义中有着特定的用途。 `##`被称为连接运算符或记号粘贴操作符。它的主要作用是将两个标识符连接成一个新的...

    C语言中宏定义"#"和"##"符号的用法

    在C语言中,宏定义是一种非常有用的机制,可以帮助开发者简化代码、提高效率和可读性。其中,"#"和"##"符号是两个非常重要的宏符号,它们可以帮助开发者在宏定义中实现字符串化和连接操作。下面我们将详细介绍这两个...

    宏定义#define用法总结

    宏的特殊单行定义可以让我们在宏定义中使用一些特殊的符号,例如 #define A(x) T_##x,这将被替换为 T_1、#define B(x) #@x,这将被替换为 '1'、#define C(x) #x,这将被替换为 "1"。 4. 多行定义 define 可以替代...

    嵌入式编程中的宏定义

    嵌入式编程中的宏定义 嵌入式编程中,宏定义是提高代码可移植性、可靠性和可读性的重要工具。宏定义可以防止出错,提高代码的可移植性和可读性,并且方便维护。下面我们将介绍一些常用的宏定义,包括防止头文件重复...

    常用宏定义#define

    在C/C++编程语言中,`#define` 是预处理器指令,用于创建宏定义,它在编译阶段执行文本替换,使得代码更加灵活且可定制化。宏定义是C/C++编程中的一个重要概念,它可以帮助程序员实现代码复用、简化复杂表达式、提供...

    C++/C 宏定义(define)中# ## 的含义

    ### C++/C宏定义(define)中#与##的含义及应用 #### 一、引言 在C++和C语言中,预处理器指令`#define`被广泛用于定义宏,这些宏可以包含简单的替换文本,也可以进行复杂的条件判断和参数处理。本文将详细介绍宏...

    267个3d绘图函数

    它接受一个源代码字符串、宏定义数组、包含导入函数名称的字符串、以及一个指针,用于接收编译后的着色器代码。 #### D3DXAssembleShaderFromFileA/W@24 这一对函数专门用于从指定的文件路径中读取并组装着色器代码...

    宏定义和函数调用的区别

    在探讨宏定义与函数调用的区别时,我们深入解析它们在C语言编程中的特性、应用场景以及潜在风险,以便更全面地理解这两种编程机制。 ### 宏定义与函数调用的本质区别 #### 宏定义(#define) 宏定义是预处理器的一...

    规范的宏定义格式以及宏定义编程技巧

    根据提供的标题、描述、标签及部分内容,我们可以提炼出与“规范的宏定义格式以及宏定义编程技巧”相关的多个知识点。 ### 规范的宏定义格式 #### 1. 防止宏重复定义 在宏定义中,为了避免同一个头文件被多次包含...

    c语言带参数的宏定义

    与函数不同,宏定义不会为形参分配内存空间。 2. **括号的重要性**:在宏定义中,为了避免意外的操作顺序,建议在形参周围加上括号。例如,在上述 `SQ` 宏的例子中,如果省略了括号,则宏调用可能不会按照预期的方式...

    C++宏定义说明(详解)

    宏定义是C++语言中预处理器的一种特性,它允许开发者创建简单的文本替换规则。通过宏定义,开发者可以在编译前阶段将特定的文本模式(宏名)替换为另一段文本(宏定义的内容)。这种特性非常有用,尤其是在定义常量...

    宏定义引用

    ### 宏定义的理解与应用 #### 1. 基本概念 宏定义是C语言中的一种预处理指令,主要用于简化程序编写过程中的某些操作,例如定义常量、函数等。通过宏定义可以将一些常用的表达式或代码段进行封装,以便于在程序中多...

    C语言中的宏定义

    ### C语言中的宏定义知识点详解 #### 一、概述 在C/C++编程语言中,宏定义是一种非常实用的功能,它允许程序员定义一系列文本替换规则,这些规则可以在编译前由预处理器处理。宏定义不仅可以简化代码编写过程,提高...

    c语言宏定义技巧,常用宏定义方法

    与获取偏移量类似,我们也可以通过宏定义来获取结构体成员的大小: ```c #define FSIZ(type, field) sizeof(((type*)0)-&gt;field) ``` 这个宏同样接受两个参数,并使用`sizeof`运算符计算出成员的实际大小。 #### ...

Global site tag (gtag.js) - Google Analytics