宏定义中的 ##和#
来源:互联网 发布:知乎成都审核招聘 编辑:程序博客网 时间:2024/04/27 08:54
## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释
#符是把传递过来的参数当成字符串进行替代。
假设程序中已经定义了这样一个带参数的宏:
#define PRINT( n ) printf( "token" #n " = %d", token##n )
同时又定义了二个整形变量:
同时又定义了二个整形变量:
int token9 = 9;
现在在主程序中以下面的方式调用这个宏:
现在在主程序中以下面的方式调用这个宏:
PRINT( 9 );
那么在编译时,上面的这句话被扩展为:
那么在编译时,上面的这句话被扩展为:
printf( "token" "9" " = %d", token9 );
注意到在这个例子中,PRINT(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。
注意到在这个例子中,PRINT(9);中的这个”9”被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9。而#n也被”9”所替代。
可想而知,上面程序运行的结果就是在屏幕上打印出token9=9
还有点不明白?!
再来一个例子:
#define PRINT( n ) printf( "token" #n " = %d", game##n )
再来一个例子:
#define PRINT( n ) printf( "token" #n " = %d", game##n )
int token9 = 9;
int game9 = 99;
调用:
PRINT(9);
屏幕上打印出:
token9 = 99
int game9 = 99;
调用:
PRINT(9);
屏幕上打印出:
token9 = 99
0 0
- 宏定义中的## 和#
- 宏定义中的#和##
- 宏定义中的 #和##
- 宏定义中的#和##
- 宏定义中的#和##
- 宏定义中的 ##和#
- 宏定义中的#和##
- C++宏定义中的## 和#
- 宏定义中的#、##和#@符号
- 宏定义中的#、##和__VA_ARGS_
- C宏定义中的 # 和 ##
- 宏定义中的"#"和"##"符号
- C++宏定义中的## 和#的区别
- gcc扩展中的宏定义中用 "#" 和 "##"
- 宏定义中的 "#" 和 "##" 的区别
- 宏定义中的 "#" 和 "##" 的区别
- 宏定义中的运算符:#和##
- 宏定义中的 "#" 和 "##" 的区别
- LINQ to Entities 不识别方法 xxx,此该方法无法转换为存储表达式
- mysql备份与恢复
- 框架中提示信息后回调选择Tab
- 如何停止Android Monkey脚本
- Java对注解的理解
- 宏定义中的 ##和#
- 我是这样克服拖延症的,你也可以试试
- IOS网络图片缓存详解
- cookie 和session 的区别详解
- List对于自定义类型,使用contains
- C++ primer 第五版 中文版 练习 12.20
- javaScript的JSON字符串转换为JSON对象。
- 欢迎使用CSDN-markdown编辑器
- 抓取软件输出的特定内容并按特定格式赋值给变量