मैंने एक printf myselef लिखा है जो va_list/va_arg/va_start/va_end/va_arg का उपयोग करता है।जीसीसी एक परियोजना को संकलित करें जो "निरस्त करने के लिए अपरिभाषित संदर्भ" दिखाता है "
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))))
सबसे पहले, मैं लिनक्स कर्नेल से इन मैक्रो कॉपी और printf 32-बिट पूर्णांक सही मुद्रित कर सकते हैं, लेकिन 64-बिट पूर्णांक मुद्रित नहीं कर सकते और मुद्रित डबल/नाव विफल हो सकता है या collapse.Then मैं कोड की जाँच करें और मुझे लगता है कि va_ * में त्रुटियां हो सकती हैं, इसलिए मैं कर्नेल के va_ * के बजाय __builtin_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)
लेकिन जीसीसी शीघ्र "` बीच में बंद करें 'को अपरिभाषित संदर्भ ", तो मैं एक खाली बीच में बंद करें बारे में() और myprintf corretly काम करता है। मेरे प्रश्न हैं:
- क्यों लिनक्स कर्नेल के
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_ *`, उनकी परिभाषा कहाँ?
@Armin के साथ सहमत हैं; आप va_arg सामान के लिए मानक शीर्षलेख का उपयोग क्यों नहीं कर रहे हैं? –
@ ओली चार्ल्सवर्थ वास्तव में, हमारी परियोजना ओएस समर्थन के बिना काम कर रही है और हम मुद्रित करने के लिए साफ नियंत्रण रखते हैं, इसलिए stdio.h हमारी आवश्यकता के अनुरूप नहीं है। – Ezio