我写了一个使用 va_list/va_arg/va_start/va_end/va_arg 的 printf myselef。
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 位整数,打印 double/float 可能会失败或崩溃。然后我检查代码,我猜 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 提示“未定义对 `abort' 的引用”,所以我写了一个空的 abort() 并且 myprintf 工作正常。我的问题是:
- 为什么 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_* 的引用,它们的定义在哪里?