Napisałem printf myselef, który używa va_list/va_arg/va_start/va_end/va_arg.użyj gcc skompiluj projekt, który pokazuje "niezdefiniowane odniesienie do` 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))))
Początkowo skopiować te makra z jądrem Linux i printf może drukować 32-bitową liczbę całkowitą poprawne, ale nie może drukować 64-bitową liczbę całkowitą i drukować podwójnej/pływaka może zawieść lub collapse.Then sprawdzić kod i Domyślam się, że va_ * może zawierać błędy, więc używam __builtin_va_ * zamiast va_ * kernela.
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)
Ale gcc szybka "niezdefiniowana odniesienia do` Abort '", więc piszę pusty abort() i myprintf działa corretly. Moje pytania są następujące:
- Dlaczego Linux Kernel
va_list/va_arg/va_start/va_end/va_arg
nie można stosować doprintf
64-bitowej liczby całkowitej i double/pływaka? - Kiedy użyłem
__builtin_va_start/__builtin_va_arg/__builtin_va_end/__builtin_va_list
, dlaczego gcc szybka „niezdefiniowana odniesienia doabort'"? But I can not find the definition of
__builtin_va_ *`, Dokąd ich definicji?
Co powiesz na?Również '_bnd' (_bnd ma być _va_align) jest zdefiniowane inaczej:' #define __va_align (ty) ((sizeof (ty) + sizeof (int) - 1) & ~ (sizeof (int) - 1)) ' –
Zgadzam się z @Armin; dlaczego nie używasz tylko standardowego nagłówka dla rzeczy va_arg? –
@Oli Charlesworth, nasz projekt działa bez wsparcia dla os i mamy kontrolę nad tym, gdzie drukować, więc stdio.h nie jest zgodny z naszymi wymaganiami. – Ezio