2012-03-20 11 views
6

मैं दैनिक जड़ सी ++ पुस्तकालयों (root.cern.ch) का उपयोग के साथ इस सी ++ पैरामीटर घोषणा को समझते हैं और स्रोत ढूंढ रहे थे जब मैं इस समारोह घोषणा भर में आया था:कृपया मेरी मदद एक तर्क

TString TString::Format(const char *va_(fmt), ...) 
{ 
    //etc. 

यह कर सकते हैं here मिलें।

मुझे समझ में नहीं आता कि const char * में इसके नाम पर कोई तर्क या ब्रांड्स हो सकता है। अभिव्यक्ति va_(fmt) बाद में एक साधारण const char * के रूप में उपयोग की जाती है, भले ही यह फ़ंक्शन कॉल या कन्स्ट्रक्टर जैसा दिखता हो। सबसे पहले मैंने सोचा कि यह परिवर्तनीय तर्क सूची के साथ कुछ करने के लिए था, जो मेरे लिए भी नया था, लेकिन stdarg.h पर प्रलेखन पढ़ने से इस प्रश्न में कोई मदद नहीं मिली।

सहायता के लिए Google को बहुत मुश्किल है क्योंकि मुझे सच में यकीन नहीं है कि इसे क्या कहना है। एक तर्क के साथ एक घोषणा? यह कोई अच्छा परिणाम नहीं देता है।

मुझे लगता था कि मुझे सी ++ पता था, लेकिन यहां क्या चल रहा है? सभी मदद की सराहना की जाएगी।

+1

मेरा अनुमान है कि 'va_' बस एक मैक्रो है। शायद वह जो कुछ भी नहीं करता है लेकिन इसके पैरामीटर में विस्तार करता है। –

उत्तर

11

यह एक मैक्रो है - Varargs.h में:

#if ... 
# define va_(arg) __builtin_va_alist 
#else 
# define va_(arg) arg 
#endif 
+7

हम सी प्रोग्रामर बताते हैं कि 'परिभाषित' सिर्फ obfuscates, लेकिन क्या वे हमें विश्वास करते हैं? * नहीं ... *^_- –

+0

धन्यवाद। मैंने उस फाइल को भी पढ़ा। मुझसे ये जरूर छूट गया होगा। – Simon

+0

मैक्रोज़ खराब क्यों हैं इसका एक और उदाहरण। यदि 'fmt' एक प्रकार था तो वाक्यविन्यास 'va_' नामक तर्क के रूप में,' char const * 'लौटने वाले फ़ंक्शन के लिए एक सूचक के रूप में एक फ़ंक्शन लेने की वैध घोषणा होगी। – bames53

संबंधित मुद्दे