我写了一个printf myselef使用va_list/va_arg/va_start/va_end/va_arg。使用gcc编译一个项目,显示“未定义的引用中止”
typedef char *va_list;
#define _AUPBND (sizeof (acpi_native_int) - 1)
#define _ADNBND (sizeof (acpi_native_int) - 1)
#define _bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))
#define va_arg(ap, T) (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))
#define va_end(ap) (void) 0
#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))
起初,我从Linux内核复制这些宏和printf的能打印的32位整数正确的,但不能打印的64位整数,并打印双/浮动可能失败或collapse.Then我检查代码和我猜va_ *可能有错误,所以我使用__builtin_va_ *而不是内核的va_ *。
typedef __builtin_va_list va_list;
#define va_start(v,l) __builtin_va_start(v,l)
#define va_end(v) __builtin_va_end(v)
#define va_arg(v,l) __builtin_va_arg(v,l)
但是GCC提示“未定义的引用'中止'”,所以我写了一个空中止()和myprintf工作corretly。 我的问题是:
- 为什么linux内核的
va_list/va_arg/va_start/va_end/va_arg
不能用于printf
64位整数和双/浮动? - 当我用
__builtin_va_start/__builtin_va_arg/__builtin_va_end/__builtin_va_list
,为什么GCC提示“未定义参考abort'"? But I can not find the definition of
__builtin_va_ *`,他们哪儿定义?
同意@Armin;你为什么不只是使用va_arg标准的标题? –
@Oli Charlesworth事实上,我们的项目没有os支持,我们无法控制打印的位置,所以stdio.h不符合我们的要求。 – Ezio