可变参数宏
来源:互联网 发布:ubuntu命令模式字体 编辑:程序博客网 时间:2024/05/17 08:54
一般在调试打印Debug信息的时候, 需要可变参数的宏. 从C99开始可以使编译器标准支持可变参数宏(variadic macros), 另外GCC也支持可变参数宏, 但是两种在细节上可能存在区别.
1. VS: __VA_ARGS__
__VA_ARGS__ 将 "..." 传递给宏 . 如
#define debug(format, ...) fprintf(stderr, format, __VA_ARGS__)
2. GCC: args
GCC使用一种不同的语法,从而可以给可变参数一个名字,如同其它参数一样.
#define debug(format, args...) fprintf (stderr, format, args)
这和第一条的宏例子是完全一样的,但是这么写可读性更强并且更容易进行描述.
##__VA_ARGS__ 和 ##args
上面两个定义的宏,如果出现 debug("A Message")的时候,由于宏展开后有个多余的逗号,所以将导致编译错误.
为了解决这个问题,CPP 使用一个特殊的"##"操作,格式如下:
VS: #define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
gcc: #define debug(format, args...) fprintf (stderr, format, ##args)
这里,如果可变参数被忽略或为空,"##"操作将使预处理器(preprocessor)去除掉它前面的那个逗号.
1. VS: __VA_ARGS__
__VA_ARGS__ 将 "..." 传递给宏 . 如
#define debug(format, ...) fprintf(stderr, format, __VA_ARGS__)
2. GCC: args
GCC使用一种不同的语法,从而可以给可变参数一个名字,如同其它参数一样.
#define debug(format, args...) fprintf (stderr, format, args)
这和第一条的宏例子是完全一样的,但是这么写可读性更强并且更容易进行描述.
##__VA_ARGS__ 和 ##args
上面两个定义的宏,如果出现 debug("A Message")的时候,由于宏展开后有个多余的逗号,所以将导致编译错误.
为了解决这个问题,CPP 使用一个特殊的"##"操作,格式如下:
VS: #define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__)
gcc: #define debug(format, args...) fprintf (stderr, format, ##args)
这里,如果可变参数被忽略或为空,"##"操作将使预处理器(preprocessor)去除掉它前面的那个逗号.
#include <stdio.h>#define PRINT(format, args...) \do { \printf(format, ##args); \} while (0)int main(){PRINT("ui %d\n", 100);PRINT("uj\n");return 0;}
0 0
- 可变参数函数 可变参数宏
- 可变参数宏
- 可变参数宏
- 可变参数宏
- 可变参数宏
- C可变参数宏
- 可变参数宏
- C宏 可变参数
- 可变参数的宏
- 可变参数宏
- 可变参数宏.c
- 可变参数宏__VA_ARGS__
- 可变参数宏
- 可变参数宏
- 可变参数宏
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- 可变参数宏__VA_ARGS__
- jlink 仿真器 烧录 海思 Hi3512 Hi3515 Hi3507 uboot 到 flash
- 机器学习理论与实战(十六)概率图模型04
- QuickSort 快速排序算法
- 顺序栈的C语言实现
- HDU 1695 GCD
- 可变参数宏
- Bytebuffer 和DirectByteBuffer
- 随手整理5
- LeetCode Rotate List
- 操作系统面试题
- [codility]GenomicRangeQuery
- java 字节流和字符流
- IOS 7 的tableViewController 整死人了,今天终于弄通了
- C#迷宫的实现(1)