有些用法一般的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
结果是## 会把前后的空格去掉完成强连接,得到和上面结果相同的宏定义。
分享到:
相关推荐
宏定义中的`#`, `#@`, 和 `##` 是特殊的运算符,它们有着特定的用途。 首先,`#` 运算符被称为“字符串化”运算符。它将宏参数转换为一个双引号包围的字符串字面量。例如,如果有一个宏 `#define macro(a) #a`,当...
在宏定义中,`#`, `##` 和 `#@` 是特殊的运算符,它们有着特定的用途。以下是这些运算符的详细解释: 1. `#`(字符串化): 当`#`放在宏参数前时,它会使宏参数在展开时被转换为一个字符串字面量。例如,在`#...
### C语言宏定义中的##连接符和#符详解 在C语言编程中,宏定义是一种常用的预处理功能,它能够帮助开发者实现代码的简化、复用以及特定逻辑的快速构建。本文将详细介绍C语言宏定义中两个特殊符号的使用:连接符`##`...
### C语言宏定义中#与##运算符详解 #### 一、引言 在C语言中,宏定义是一种非常强大的工具,它可以帮助程序员简化代码、提高编程效率。宏定义不仅支持简单的文本替换,还提供了两个特殊的运算符:`#` 和 `##`。...
在C语言中,宏定义是一种预处理指令,用于在编译之前替换文本。`##`和`#`是两个特殊的运算符,它们在宏定义中有着特定的用途。 `##`被称为连接运算符或记号粘贴操作符。它的主要作用是将两个标识符连接成一个新的...
在C语言中,宏定义是一种非常有用的机制,可以帮助开发者简化代码、提高效率和可读性。其中,"#"和"##"符号是两个非常重要的宏符号,它们可以帮助开发者在宏定义中实现字符串化和连接操作。下面我们将详细介绍这两个...
宏的特殊单行定义可以让我们在宏定义中使用一些特殊的符号,例如 #define A(x) T_##x,这将被替换为 T_1、#define B(x) #@x,这将被替换为 '1'、#define C(x) #x,这将被替换为 "1"。 4. 多行定义 define 可以替代...
嵌入式编程中的宏定义 嵌入式编程中,宏定义是提高代码可移植性、可靠性和可读性的重要工具。宏定义可以防止出错,提高代码的可移植性和可读性,并且方便维护。下面我们将介绍一些常用的宏定义,包括防止头文件重复...
在C/C++编程语言中,`#define` 是预处理器指令,用于创建宏定义,它在编译阶段执行文本替换,使得代码更加灵活且可定制化。宏定义是C/C++编程中的一个重要概念,它可以帮助程序员实现代码复用、简化复杂表达式、提供...
### C++/C宏定义(define)中#与##的含义及应用 #### 一、引言 在C++和C语言中,预处理器指令`#define`被广泛用于定义宏,这些宏可以包含简单的替换文本,也可以进行复杂的条件判断和参数处理。本文将详细介绍宏...
它接受一个源代码字符串、宏定义数组、包含导入函数名称的字符串、以及一个指针,用于接收编译后的着色器代码。 #### D3DXAssembleShaderFromFileA/W@24 这一对函数专门用于从指定的文件路径中读取并组装着色器代码...
在探讨宏定义与函数调用的区别时,我们深入解析它们在C语言编程中的特性、应用场景以及潜在风险,以便更全面地理解这两种编程机制。 ### 宏定义与函数调用的本质区别 #### 宏定义(#define) 宏定义是预处理器的一...
根据提供的标题、描述、标签及部分内容,我们可以提炼出与“规范的宏定义格式以及宏定义编程技巧”相关的多个知识点。 ### 规范的宏定义格式 #### 1. 防止宏重复定义 在宏定义中,为了避免同一个头文件被多次包含...
与函数不同,宏定义不会为形参分配内存空间。 2. **括号的重要性**:在宏定义中,为了避免意外的操作顺序,建议在形参周围加上括号。例如,在上述 `SQ` 宏的例子中,如果省略了括号,则宏调用可能不会按照预期的方式...
宏定义是C++语言中预处理器的一种特性,它允许开发者创建简单的文本替换规则。通过宏定义,开发者可以在编译前阶段将特定的文本模式(宏名)替换为另一段文本(宏定义的内容)。这种特性非常有用,尤其是在定义常量...
### 宏定义的理解与应用 #### 1. 基本概念 宏定义是C语言中的一种预处理指令,主要用于简化程序编写过程中的某些操作,例如定义常量、函数等。通过宏定义可以将一些常用的表达式或代码段进行封装,以便于在程序中多...
### C语言中的宏定义知识点详解 #### 一、概述 在C/C++编程语言中,宏定义是一种非常实用的功能,它允许程序员定义一系列文本替换规则,这些规则可以在编译前由预处理器处理。宏定义不仅可以简化代码编写过程,提高...
与获取偏移量类似,我们也可以通过宏定义来获取结构体成员的大小: ```c #define FSIZ(type, field) sizeof(((type*)0)->field) ``` 这个宏同样接受两个参数,并使用`sizeof`运算符计算出成员的实际大小。 #### ...