2013-07-24 12 views
5
static inline __printf(2, 3) 
int dev_err(const struct device *dev, const char *fmt, ...) 
{ return 0; } 

__printf() क्या है और dev_err का तीसरा तर्क (...) क्या है? मैं कल्पना कर सकता हूं कि यह फ़ंक्शन किसी प्रकार का सामान्य कार्य है। यह क्या करता है?यह सामान्य कार्य क्या करता है?

+0

तीसरा तर्क का अर्थ है, यह फ़ंक्शन तर्कों की चर संख्या, va_args लेता है; – Ishmeet

+1

तर्क '(...) 'तर्कों की परिवर्तनीय संख्याओं के लिए है, [इस कोड को देखें कि यह कैसे काम करता है] (http://stackoverflow.com/questions/15967344/loop-through-char-c/15967653#15967653), ध्यान दें कि विभिन्न प्रकार के तर्कों के साथ एक ही फ़ंक्शन कहा जाता है। –

+1

'__printf' खोजकर, मुझे पता चला कि यह यहां वर्णित एक विशेषता के लिए # परिभाषा है: http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html – chris

उत्तर

11

__printf(2,3) को छोड़कर सबकुछ काफी मानक (परिवर्तनीय तर्क प्रसंस्करण) है।

समारोह (static या inline संशोधक के समान) के लिए यह संशोधक संकलक है कि यह तर्क 2 (fmt) वास्तविक मानकों के खिलाफ में प्रारूप स्ट्रिंग की जाँच करनी चाहिए तर्क 3 से शुरू बताता है, printf शैली प्रारूप का उपयोग विनिर्देशक।

दूसरे शब्दों में, इसके साथ बुला:

dev_err (pDev, "%d", 1.0); 

होगा झंडा एक चेतावनी है क्योंकि प्रारूप स्ट्रिंग और वास्तविक बहस मेल नहीं खाते।

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

लिनक्स को परिभाषित करता है __printf(a, b)__attribute__((format(printf, a, b))) और जीसीसी के रूप में है कि दूसरी प्रारूप varargs-चेकिंग विशेषता के रूप में प्रति here (नीचे दूसरे शब्दों में बयान) निर्दिष्ट कर सकते हैं:


प्रारूप (मूलरूप आदर्श, स्ट्रिंग सूचकांक, प्रथम टू-चेक):

स्वरूप विशेषता निर्दिष्ट करती है कि एक फ़ंक्शन printf, scanf, strftime या strfmon शैली तर्क लेता है जिसे प्रारूप स्ट्रिंग के विरुद्ध टाइप-चेक किया जाना चाहिए। उदाहरण के लिए, घोषणा:

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

printf शैली प्रारूप स्ट्रिंग तर्क my_format साथ स्थिरता के लिए my_printf के लिए कॉल में तर्क की जाँच करने के संकलक का कारण बनता है।

उपरोक्त उदाहरण में, प्रारूप स्ट्रिंग (my_format) समारोह my_print का दूसरा तर्क है, और तीसरा तर्क के साथ शुरू की जांच करने के तर्क, इसलिए प्रारूप विशेषता के लिए सही मापदंडों 2 और 3

हैं

प्रारूप विशेषता आपको अपने कार्यों की पहचान करने की अनुमति देती है जो प्रारूप तारों को तर्क के रूप में लेते हैं, ताकि जीसीसी इन कार्यों को त्रुटियों के लिए कॉल की जांच कर सके।

समारोह अपने आप में क्या करता है, नहीं एक बहुत लौटने शून्य :-)

यह लगभग निश्चित रूप एक प्लेसहोल्डर आप कभी वास्तव में एक असली dev_err() समारोह को लागू करना चाहते हैं चाहिए है के अलावा अन्य के रूप में।

0

__printf एक समारोह शायद अपने पुस्तकालय में परिभाषित आप संकलक के साथ उपयोग कर रहे हैं, और dev_err में ... मतलब है कि यह तर्क, va_args की चर संख्या लेता है;

+2

आपको इसे गलत तरीके से मिला है। 'dev_err' फ़ंक्शन है और '__printf' सिर्फ एक मैक्रो है। –

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