Ich schrieb eine printf myselef, die va_list/va_arg/va_start/va_end/va_arg verwenden.Verwenden Sie gcc kompilieren Sie ein Projekt, das "undefinierte Verweis auf` abort '"zeigt
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))))
Zunächst kopiere ich diese Makros von Linux-Kernel und die printf 32-Bit-Integer korrekt gedruckt werden kann, aber nicht 64-Bit-Integer drucken und Doppel/float drucken kann fehlschlagen oder collapse.Then prüfe ich den Code und Ich schätze, der va_ * könnte Fehler haben, also benutze ich __builtin_va_ * anstelle von kernel's 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)
Aber gcc prompt "undefined reference to` Abbruch '", so schreibe ich einen leeren Abbruch() und myprintf arbeitet corretly. Meine Fragen sind:
- Warum
va_list/va_arg/va_start/va_end/va_arg
der Linux-Kernel nicht fürprintf
64-Bit-Integer verwendet und Doppel/schweben? - Als ich noch
__builtin_va_start/__builtin_va_arg/__builtin_va_end/__builtin_va_list
, warum gcc prompt „undefined reference toabort'"? But I can not find the definition of
__builtin_va_ *`, Wo ist ihre Definition?
Wie wäre es mit einem?Auch '_bnd' (_bnd soll _va_align sein) ist dort anders definiert:' #define __va_align (ty) ((sizeof (ty) + sizeof (int) - 1) & ~ (sizeof (int) - 1)) ' –
Stimmen Sie mit @Armin überein; Warum benutzt du nicht einfach den Standard-Header für va_arg Zeug? –
@Oli Charlesworth in der Tat, unser Projekt arbeitet ohne os Unterstützung und wir brauchen Kontrolle, wo zu drucken, so dass die stdio.h ist nicht im Einklang mit unserer Anforderung. – Ezio