#define TEST_QUEUE_DEBUD
#ifdef TEST_QUEUE_DEBUD
#define LOG(fmt,args...) printk(fmt,##args)
#else
#define LOG(fmt,args...)
#endif
如上代码,在模块软件调试阶段,可以定义宏开关,等发布时,去掉即可。
这里涉及到可变参数的问题
下面举例来说明可变参数:
void test(int,...); 第一个参数来指明可变参数的个数,例如test(2,1,2)表示两个参数分别为1和2.
函数在设计时,需要包含stdarg.h头文件:
以下是可变参数的基本使用方式:
- 定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数。
- 在函数定义中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的。
- 使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表。宏 va_start 是在 stdarg.h 头文件中定义的。
- 使用 va_arg 宏和 va_list 变量来访问参数列表中的每个项。
- 使用宏 va_end 来清理赋予 va_list 变量的内存
#include <stdio.h>
#include <stdarg.h>
void test(int num ,...)
{
int num;
va_list valist; //初始化列表
va_start(valist, num); //把数据压列表
num = va_arg(valist, int); //访问指定的数据
va_end(valist); //释放内存
}
从上面代码可以猜想到,可变参数的实现是基于malloc的,使用malloc来动态分配内存空间,根据一个指试器来找到对应的内容。最后还要释放内存(暴露了自己使用了malloc)。