Я написал printf myselef, который использует va_list/va_arg/va_start/va_end/va_arg.использовать gcc компилировать проект, который показывает «неопределенная ссылка на` abort »
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)
Но НКА подсказки "неопределенная ссылка на` прерывания '", так что я пишу пустой Abort() и 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
, почему НКУ подсказка «неопределенная ссылка наabort'"? But I can not find the definition of
__builtin_va_ *`, их определение Куда?
Как насчет?Также '_bnd' (_bnd предполагается ot быть _va_align) определяется по-разному:' #define __va_align (ty) ((sizeof (ty) + sizeof (int) - 1) & ~ (sizeof (int) - 1)) ' –
Согласен с @Armin; почему вы не просто используете стандартный заголовок для va_arg? –
@ Oli Charlesworth действительно, наш проект работает без поддержки os, и мы не контролируем, где печатать, поэтому stdio.h не соответствует нашему требованию. – Ezio