C++ ## ... 实用
2016-12-14 20:16
211 查看
关于...的使用
...在C宏中称为Variadic Macro,也就是变参宏。比如:
#define myprintf(templt,...)fprintf(stderr,templt,__VA_ARGS__)
// 或者
#define myprintf(templt,args...) fprintf(stderr,templt,args)
第一个宏中由于没有对变参起名,我们用默认的宏__VA_ARGS__来替代它。第二个宏中,我们显式地命名变参为args,那么我们在宏定义中就可以用args来代指变参了。同C语言的stdcall一样,变参必须作为参数表的最有一项出现。当上面的宏中我们只能提供第一个参数templt时,C标准要求我们必须写成:
myprintf(templt,);
的 形式。这时的替换过程为:
myprintf("Error!\n",);
替换为:
fprintf(stderr,"Error!\n",);
这是一个语法错误,不能正常编译。这个问题一般有 两个解决方法。首先,GNU CPP提供的解决方法允许上面的宏调用写成:
myprintf(templt);
而它将会 被通过替换变成:
fprintf(stderr,"Error!\n",);
很明显,这里仍然会产生编译错误(非本例的 某些情况下不会产生编译错误)。除了这种方式外,c99和GNUCPP都支持下面的宏定义方式:
#define myprintf(templt, ...) fprintf(stderr,templt,##__VAR_ARGS__)
这 时,##这个连接符号充当的作用就是当__VAR_ARGS__为空的时候,消除前面的那个逗号。那么此时的翻译过程如下:
myprintf(templt);
被转化为:
fprintf(stderr,templt);
这样如果templt合法,将不会产生 编译错误。 这里列出了一些宏使用中容易出错的地方,以及合适的使用方式。
...在C宏中称为Variadic Macro,也就是变参宏。比如:
#define myprintf(templt,...)fprintf(stderr,templt,__VA_ARGS__)
// 或者
#define myprintf(templt,args...) fprintf(stderr,templt,args)
第一个宏中由于没有对变参起名,我们用默认的宏__VA_ARGS__来替代它。第二个宏中,我们显式地命名变参为args,那么我们在宏定义中就可以用args来代指变参了。同C语言的stdcall一样,变参必须作为参数表的最有一项出现。当上面的宏中我们只能提供第一个参数templt时,C标准要求我们必须写成:
myprintf(templt,);
的 形式。这时的替换过程为:
myprintf("Error!\n",);
替换为:
fprintf(stderr,"Error!\n",);
这是一个语法错误,不能正常编译。这个问题一般有 两个解决方法。首先,GNU CPP提供的解决方法允许上面的宏调用写成:
myprintf(templt);
而它将会 被通过替换变成:
fprintf(stderr,"Error!\n",);
很明显,这里仍然会产生编译错误(非本例的 某些情况下不会产生编译错误)。除了这种方式外,c99和GNUCPP都支持下面的宏定义方式:
#define myprintf(templt, ...) fprintf(stderr,templt,##__VAR_ARGS__)
这 时,##这个连接符号充当的作用就是当__VAR_ARGS__为空的时候,消除前面的那个逗号。那么此时的翻译过程如下:
myprintf(templt);
被转化为:
fprintf(stderr,templt);
这样如果templt合法,将不会产生 编译错误。 这里列出了一些宏使用中容易出错的地方,以及合适的使用方式。
相关文章推荐
- 简单实用的C#分词源代码(含词库素材下载)
- 18款jquery幻灯片图片切换 非常实用
- MAC 实用tips
- 非常实用的PHP常用函数汇总
- android studio/ecplice全世界最实用的快捷键
- 实用Apache的mod_proxy可以实现负载均衡。
- GPUImage的简单实用
- 20个非常实用的Java程序代码片段
- vi/vim 介绍和简单实用(转自菜鸟教程)
- DB2 基础: 使用 DB2 数据移动实用工具中的文件类型修饰符
- oracle实用工具:oradebug
- 实用设计模式之单例模式
- Oracle数据库-实用SQL
- 总结我用过的Vertx实用案例
- asp.net非常实用语句
- 实用软件开发框架-第1讲
- 11个实用jQuery日历插件
- 实用的ajaxfileupload插件
- npm 超实用指令使用场景