#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
char *vasprintf(const char *fmt, va_list ap)
{
unsigned int first, second;
char *p;
va_list aq;
va_copy(aq, ap);
first = vsnprintf(NULL, 0, fmt, aq);
va_end(aq);
p = malloc(first + 1);
if (!p)
return NULL;
second = vsnprintf(p, first + 1, fmt, ap);
if(first != second)
printf("different return values (%u and %u) from vsnprintf(\"%s\", ...)",
first, second, fmt);
return p;
}
void debug_helper(const char *TAG, const char *fmt, va_list args)
{
char *str = vasprintf(fmt, args);
if(str)
{
printf("%s: %s\n", TAG, str);
free(str);
}
}
void debug(const char *TAG, const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
debug_helper(TAG, fmt, args);
va_end(args);
}
#define DEBUG_ERROR(...) debug("ERROR", __VA_ARGS__)
int main(int argc, char const *argv[])
{
DEBUG_ERROR("Something wrong!");
const char *TAG = __FUNCTION__;
debug(TAG, "Some information");
return 0;
}
vasprintf 实现和 va_list
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 其实这些都是C语言提供的处理变长参数的方法。 在做网络请求的时候,我们几乎总是会需要组织参数。对于参数个数可变的情...
- 1、va_list 2、va_start 输出参数ap(类型为va_list): 用于保存函数参数列表中可变参数的...
- 摘要 对于可变参数这种什么va_list之类的东西,很多人会觉得很陌生,其实这个一点都不陌生,反而说很是熟悉。奇怪...
- 1.va_list,va_start,va_arg,va_end 输出结果为 2.(instancetype)in...