Ezi*_*zio 7 c linux printf variadic-functions
我写了一个使用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))))
Run Code Online (Sandbox Code Playgroud)
首先,我从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)
Run Code Online (Sandbox Code Playgroud)
但是gcc提示"未定义引用`abort'",所以我写了一个空的abort()和myprintf正确地工作.我的问题是:
va_list/va_arg/va_start/va_end/va_arg不能用于printf64位整数和double/float?__builtin_va_start/__builtin_va_arg/__builtin_va_end/__builtin_va_list,为什么gcc会提示"未定义引用abort'"? But I can not find the definition of__builtin_va_*`,这是他们的定义?不要从 Linux 头文件中剪切和粘贴内容。相反,将其放在源文件的顶部:
#include <stdarg.h>
Run Code Online (Sandbox Code Playgroud)
这将为您提供使用va_list和所需的一切va_arg。但是,它不会引入printf或任何标准 I/O 内容(位于 中<stdio.h>)。