Tôi đã viết một printsel myselef sử dụng va_list/va_arg/va_start/va_end/va_arg.sử dụng gcc biên dịch một dự án cho thấy "tham chiếu chưa xác định thành` hủy bỏ ""
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))))
Lúc đầu, tôi sao chép các macro từ kernel linux và printf có thể in 32-bit integer đúng nhưng không thể in 64-bit số nguyên và in đôi/float có thể thất bại hoặc collapse.Then tôi kiểm tra mã và Tôi đoán va_ * có thể có lỗi, vì vậy tôi sử dụng __builtin_va_ * thay vì của kernel và_ *.
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)
Nhưng dấu nhắc gcc "undefined reference to` abort '", vì vậy tôi viết abort trống() và myprintf hoạt động đúng. Câu hỏi của tôi là:
- Tại sao Linux kernel của
va_list/va_arg/va_start/va_end/va_arg
có thể không được sử dụng choprintf
64-bit số nguyên và đôi/nổi? - Khi tôi sử dụng
__builtin_va_start/__builtin_va_arg/__builtin_va_end/__builtin_va_list
, tại sao gcc nhắc "không xác định tham chiếu đếnabort'"? But I can not find the definition of
__builtin_va_ *`, Ở đâu rồi định nghĩa của họ?
Làm thế nào về một?Ngoài ra '_bnd' (_bnd được cho là ot là _va_align) được định nghĩa khác nhau trong đó:' #define __va_align (ty) ((sizeof (ty) + sizeof (int) - 1) & ~ (sizeof (int) - 1)) ' –
Đồng ý với @Armin; tại sao bạn không chỉ sử dụng tiêu đề chuẩn cho công cụ va_arg? –
@ Charles Charlesworth thực sự, dự án của chúng tôi đang làm việc mà không cần hỗ trợ os và chúng tôi nead kiểm soát nơi để in, do đó stdio.h không phù hợp với yêu cầu của chúng tôi. – Ezio