有些用法一般的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
结果是## 会把前后的空格去掉完成强连接,得到和上面结果相同的宏定义。
分享到:
相关推荐
。。。
。。。
这是一篇关于C语言宏定义##连接符和#符的使用的介绍说明
本文主要介绍了C语言中#与##运算符的用法与区别。
C语言宏定义中#用法,大家可以参考一下。
该文档详细的说明了##与#在宏定义中的作用以及用法
本篇文章详细介绍C语言中宏定义"#"和"##"符号的用法,希望对大家的C语言学习有所帮助。
常用宏定义#define
C语言中宏定义#define用法总结 1.简单的宏定义 2.带参数的宏 3.宏的特殊单行定义
介绍C++/C 宏定义(define)中# ## 的含义, 并以C++代码举例说明
关于嵌入式中常用的、生僻的宏定义的解释,特别是在提高代码可移植性,可靠性及可读性的方面对大家会有较好的帮助。
下面列举一些成熟软件中常用得宏定义。。。。。。 1,防止一个头文件被重复包含 #ifndef COMDEF_H #define COMDEF_H //头文件内容 #endif 2,重新定义一些类型,防止由于各种平台和编译器的不同,而...
内联函数与宏本质上是两个不同的概念如果程序编写者对于既要求快速,又要求可读的情况下,则应该将函数冠以inline
sourceInsight 宏定义文件 sourceInsight 宏定义文件 sourceInsight 宏定义文件 sourceInsight 宏定义文件
宏定义技巧,#define等
在sourceInsigth中加入这些宏定义,可以提高工种效率,使用更方便!比如注释掉某段代码,只需要一个快捷键!
MFC 宏定义详解 MFC 宏定义详解 MFC 宏定义详解
实际上确切的说这应该是预处理功能中三种(宏定义,文件包含和条件编译)中的一种----条件编译。 C语言在对程序进行编译时,会先根据预处理命令进行“预处理”。C语言编译系统包括预处理,编译和链接等部分
306-宏定义应用举例(51单片机C语言实例Proteus仿真和代码)306-宏定义应用举例(51单片机C语言实例Proteus仿真和代码)306-宏定义应用举例(51单片机C语言实例Proteus仿真和代码)306-宏定义应用举例(51单片机C语言实例...
写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。