宏定义中#,#@,##的用法.doc_第1页
宏定义中#,#@,##的用法.doc_第2页
宏定义中#,#@,##的用法.doc_第3页
宏定义中#,#@,##的用法.doc_第4页
宏定义中#,#@,##的用法.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

宏定义中#的用法分类:VC/MFC2011-01-09 11:3249人阅读评论(0)收藏举报惭愧, 今天测试了才真正明白, 在宏定义中使用#, 还是因为群里有TX提出, 才测试的看代码:view plain1. #definemacro(a)#a2. #definemacro2(a,b)a#b3. #definemacro3(a,b,c)a#b#c#a, 表示a不再是一个变量, 而变成了字符串a#表示连接, a#b, 表示输入的参数名为ab, a#b#c同理, 代表变量名为: abc测试例子:view plain1. intx=3;2. inty=4;3. intxy=10;4. intxyz=20;5. CStringstr;6. 7. 8. OutputDebugString(macro(x);9. 10. str.Format(%d,macro2(x,y);11. OutputDebugString(str);12. 13. str.Format(%d,macro3(x,y,z);14. OutputDebugString(str);输出结果为:x1020第一个为x, marco(x), x变成了x字符串第二个为10, macro(x,y), 就是变量xy第三个为20, macro(x,y,z), 就是变量xyzC语言宏定义中#,#和#的用法一、一般用法#把宏参数变为一个字符串,#把宏参数变为一个字符,#把两个宏参数贴合在一起。#include #include #define STR(s) #s / #与参数之间可以有空格#define TOCHAR(c) #c #define CONS(a,b) int(a#e#b) / #与参数之间可以有空格int main(void) printf(STR(pele); / 输出字符串pele printf(%cn, TOCHAR(z); / 输出字符z printf(%dn, CONS(2,3); / 2e3 输出:2000 return 0;二、当宏参数是另一个宏的时候需要注意的是凡宏定义里有用#或#的地方宏参数是不会再展开的。#define A (2)#define STR(s) #s#define CONS(a,b) int(a#e#b)printf(int max: %sn, STR(INT_MAX);这行会被展开为:printf(int max: %sn, INT_MAX);printf(%sn, CONS(A, A); 这一行被展开为:printf(%sn, int(AeA);INT_MAX和A都不会再被展开, 然而解决这个问题的方法很简单,多加一层中间转换宏。加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数。#define A (2)#define _STR(s) #s#define STR(s) _STR(s) / 转换宏#define _CONS(a,b) int(a#e#b)#define CONS(a,b) _CONS(a,b) / 转换宏printf(int max: %sn, STR(INT_MAX);输出为:int max: 0x7fffffffSTR(INT_MAX) - _STR(0x7fffffff) - 0x7fffffffprintf(%dn, CONS(A, A);输出为:200CONS(A, A) - _CONS(2), (2) - int(2)e(2)以下为Minix3操作系统相关的源代码:#ifdef _ANSI#define _str(x) # x#define _xstr(x) _str(x) / 转换宏_PROTOTYPE( void _bad_assertion, (const char *_mess) );#define assert(expr)(expr)? (void)0 : _bad_assertion(Assertion #expr failed, file _xstr(_FILE_) , line _xstr(_LINE_) n)三、#和#的一些应用特例1、合并匿名变量名#define _ANONYMOUS1(type, var, line) type var#line#define _ANONYMOUS0(type, line) _ANONYMOUS1(type, _anonymous, line)#define ANONYMOUS(type) _ANONYMOUS0(type, _LINE_)例:ANONYMOUS(static int); 即: static int _anonymous70; 70表示该行行号;第一层:ANONYMOUS(static int); - _ANONYMOUS0(static int, _LINE_);第二层: - _ANONYMOUS1(static int, _anonymous, 70);第三层: - static int _anonymous70;即每次只能解开当前层的宏,所以_LINE_在第二层才能被解开;2、填充结构#define FILL(a) a, #aenum IDDOPEN, CLOSE;typedef struct MSG IDD id; const char * msg;MSG;MSG _msg = FILL(OPEN), FILL(CLOSE);相当于:MSG _msg = OPEN, OPEN, CLOSE, CLOSE;3、记录文件名#define _GET_FILE_NAME(f) #f#define GET_FILE_NAME(f) _GET_FILE_NAME(f) / 转换宏static char FILE_NAME = GET_FILE_NAME(_FILE_);4、得到一个数值类型所对应的字符串缓冲大小#define _TYPE_BUF_SIZE(type) sizeof #type#define TYPE_BUF_SIZE(type) _TYPE_BUF_SIZE(type)char bufTYPE_BUF_SIZE(INT_MAX); - char buf_TYPE_BUF

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论