2016-05-12 12 views
6

द्वारा जाँच की जा करने के लिए, संकलक के बारे में प्रारूप स्ट्रिंग है कि इस्तेमाल किया जा रहा के अनुसार गलत तर्क चेतावनी देते हैं। उदाहरण के तौर पर नीचे दिया गया कोड एक त्रुटि संदेश प्राप्त करेगा जिसमें प्रारूप 3 तर्क निर्दिष्ट किए गए हैं लेकिन असल में आप केवल दो में पारित हुए हैं।printf() आवरण तर्क जीसीसी

printf("%d%d%d", 1, 2); 

जब printf() करने के लिए एक आवरण लेखन, कैसे आप इस क्षमता रखते हैं? फ़ंक्शन या मैक्रो का एक रूप वह होगा जो मैं सोच सकता हूं। लेकिन सरल पार्स भी स्वीकार्य हो सकते हैं।

एक प्रिंटफ रैपर लिखने के कुछ तरीके स्टैक ओवरफ्लो पर पाए जा सकते हैं। दो आम दृष्टिकोण using vprintf with varargs, और using __builtin_apply हैं। मैंने इन दो दृष्टिकोणों की कोशिश की है, कोई भी काम नहीं किया।

उत्तर

3

आप प्रारूप स्ट्रिंग के खिलाफ पैरामीटर को जांचने के लिए gcc प्रारूप फ़ंक्शन विशेषता का उपयोग कर सकते हैं।

extern int my_printf (void *my_object, const char *my_format, ...) 
      __attribute__ ((format (printf, 2, 3))); 

चेक जीसीसी मैनुअल "6.31.1 Common Function Attributes"

+0

भयानक! यह पूरी तरह से काम करता है! – minghua

+1

एक नोट यदि 'my_printf' एक वर्ग सदस्य है: तर्क संख्या में 1 जोड़ें। यह '__attribute__ बन जाएगा ((प्रारूप (printf, 3, 4)));' – minghua