C语言中两个井号"##"和一个井号"#"的使用方法
2012-11-06 16:57
337 查看
最近看了一些dsp的库函数,发现了一些使用##的宏定义,以前没有用到过,后来差了些资料,学习了##的用法。
例如下面的语句:
#define CSL_FMK(PER_REG_FIELD, val) (((val) << CSL_##PER_REG_FIELD##_SHIFT) & CSL_##PER_REG_FIELD##_MASK)
其实,
## 是连接符号,由两个井号组成,其功能是在带参数的宏定义中将两个子串(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”所替代。
可想而知,上面程序运行的结果就是在屏幕上打印出token9=9
还有点不明白?
再来一个例子:
#define PRINT( n ) printf( "token" #n " = %d", game##n )
int token9 = 9;
int game9 = 99;
调用:
PRINT(9);
屏幕上打印出:
token9 = 99
例如下面的语句:
#define CSL_FMK(PER_REG_FIELD, val) (((val) << CSL_##PER_REG_FIELD##_SHIFT) & CSL_##PER_REG_FIELD##_MASK)
其实,
## 是连接符号,由两个井号组成,其功能是在带参数的宏定义中将两个子串(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”所替代。
可想而知,上面程序运行的结果就是在屏幕上打印出token9=9
还有点不明白?
再来一个例子:
#define PRINT( n ) printf( "token" #n " = %d", game##n )
int token9 = 9;
int game9 = 99;
调用:
PRINT(9);
屏幕上打印出:
token9 = 99
相关文章推荐
- 10_9_2从类MyClass中派生一个类MyDervedClass,重写GetString(),使用该方法的基类实现代码从基类中返回一个字符串,但在返回的字符串中添加文本"(output fro)"
- Angular在一个页面中使用两个ng-app的方法(二)
- SQL2000建表时"MMC检测到此管理单元发生一个错误,建议关闭并重新启动MMC。"的解决方法
- socket何时处于”读就绪状态“?---通过“应用程序大爷"和"内核孙子"对话再看重要的select函数的使用方法
- 两个控件使用同一个对应函数的方法
- 请设计输出实数的格式,包括:⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数。实数用"6.2f"格式输出。
- 用c语言实现一个通讯录; 通讯录可以存储1000个人的信息,信息包括姓名、性别、年龄、电话、住址 提供方法: 1.添加联系人信息 2.删除指定联系人信息 3.查找指定联系人信息 4.修改指定联系&
- 两个JSP页面之间如何传递一个对象?比如一个LIST或者HASHMAP?以及为什么有时候REQUEST.GETATTRIBUTE("NAME")取不到值?
- 总结C++中三种关于"new"的使用方法
- 一个在SSAS中的"The attribute key cannot be found" Error处理方法
- 在asp.net中使用ajax时出现的"'Sys' 未定义"的解决方法
- 写student类中的select,delete,update,insert方法并在objectDataSource中应用(分别写两个,一个返回datatable,一个使用list)
- 写student类中的select,delete,update,insert方法并在objectDataSource中应用(分别写两个,一个返回datatable,一个使用list)
- Xcode中git的使用方法介绍与"Please tell me who you are"问题的解决方案
- 定义Person类,Person类中含有两个属性name 和age ,使用compare方法比较两个对象是否为同一个对象。假定name 和age 都相同就似为同一个对象
- 引用css样式时,一个class引用两个样式的写法( class="ico001 icoCom")。
- 为什么在中断向量表中不直接LDR PC ,"异常地址"。而是使用一个标号,然有再在后面使用 DCD定义这个标号
- "getline" bug fix for Microsoft Visual C++ 6.0 关于VC6的getline输入需要两个回车才结束的BUG修改方法
- 去除使用log时的警告信息:"LOG_TAG" redefined 的方法
- 使用控件时提示"未声明标识符"的解决方法