2012-01-16 22 views
10

मैं एक static inline समारोह एक एच फाइल में परिभाषित है इनलाइन करने के लिए, और एक सी फ़ाइल में एक बिंदु पर, मैं इस तरह कार्य करने के लिए एक सूचक है, कुछ बताए हूँ:सी: सूचक समारोह

foo.h :

static inline void frobnicate(void) { 
    // frobs something. 
} 

foo.c

#include "foo.h" 

void execute(void (*func)(void)) { 
    func(); 
} 

void blahBlahBlah(void) { 
    execute(frobnicate); 
} 

bar.c

#include "foo.h" 
// ... 
frobnicate(); 

तो मुझे लगता है यहाँ क्या होगा कि संकलक bar.c से frobnicate करने के लिए कॉल इनलाइन जाएगा, लेकिन foo.c में, यह वास्तव में frobnicate लागू करने के लिए एक समारोह बनाने के लिए, इतना है कि यह एक काम हो सकता है होगा इसके लिए सूचक।

क्या कोई मेरी पुष्टि कर सकता है कि मेरी समझ सटीक है, और मुझे अन्यथा सही करें?

+2

* आप * जेनरेट कोड पढ़कर इसे पुष्टि कर सकते हैं। मुझे नहीं लगता कि एक निर्दिष्ट तरीका है जिसमें यह * काम करने के लिए है। मैं आश्चर्यचकित नहीं होगा अगर संकलक चला जाता है "कोई इसका पता चाहता है, तो चलिए इसे इनलाइन नहीं करते हैं, फिर"। – unwind

+7

याद रखें कि 'इनलाइन' केवल कंपाइलर –

उत्तर

10

inline सी मानक के गलत नामकों में से एक है। इसका मुख्य अर्थ लिंक समय पर "एकाधिक परिभाषा" समस्याओं से निपटने के बिना एक शीर्षलेख फ़ाइल में फ़ंक्शन की परिभाषा डालने में सक्षम होना है।

सी 99 और सी 11 में आधिकारिक तरीका जो आप प्राप्त करना चाहते हैं वह है inlinestatic के बिना हेडर फ़ाइल में परिभाषा है। चूंकि आपको उत्सर्जित होने के प्रतीक की भी आवश्यकता है, इसलिए आपको संकलक को बताने की आवश्यकता है जिसमें संकलन इकाई यह होनी चाहिए। इस तरह की एक तत्कालता उस .c फ़ाइल में घोषणा द्वारा की जा सकती है जहां आप inline कीवर्ड छोड़ देते हैं।

सबसे स्वाभाविक रूप से आप .c फ़ाइल का उपयोग कर सकते हैं जहां आपको वास्तव में प्रतीक की आवश्यकता होती है।

+0

यदि इनलाइन परिभाषा 'स्थिर' के बिना हेडर फ़ाइल में है, तो क्या मैं लिंक करने का प्रयास करते समय उसी नाम (इनलाइन फ़ंक्शन) की एकाधिक परिभाषा नहीं रखूंगा? – brianmearns

+0

आपके पास संबंध समस्याएं होंगी। या तो इसे 'स्थैतिक इनलाइन' बनाएं, और कई परिभाषाओं को जोखिम दें, या इनलाइन छोड़ दें।आप एक रैपर भी बना सकते हैं, जो एक सी फाइल में होगा और इनलाइन नहीं होगा, और इसमें एक पॉइंटर लें (कोई प्रदर्शन हिट नहीं है, क्योंकि असली फ़ंक्शन रैपर में रेखांकित किया जाएगा)। – ugoren

+0

@bmearns, एक सी 99 अनुपालन कंपाइलर के साथ आपको कोई संबंध समस्या नहीं होगी। यह वास्तव में 'इनलाइन' कीवर्ड की भावना है। http://gustedt.wordpress.com/2010/11/29/myth-and-reality-about-inline-in-c99/ –

7

हाँ, आप सही हैं। जब आप फ़ंक्शन में पॉइंटर लेते हैं तो संकलक को "अकेले खड़े" संस्करण बनाना होगा जहां कोड को सामान्य फ़ंक्शन के रूप में बुलाया जा सकता है।

फ़ंक्शन को रेखांकित करने का लाभ यह है कि कॉलिंग कोड को बनाने की आवश्यकता नहीं है और कॉलर फ़ंक्शन और इनलाइन फ़ंक्शन दोनों को एकीकृत करने के लिए किसी भी अन्य अनुकूलन को लागू किया जा सकता है। लेकिन जब आपको फ़ंक्शन पर नियमित कॉल करने की आवश्यकता होती है (जैसे कि जब आप इसे बाद में कॉल करने के लिए पता लेते हैं), तो उन अनुकूलन अब और संभव नहीं हैं।

+2

पर _ _uggestion_ है, यह कई कंपाइलरों के लिए सच हो सकता है, लेकिन मैं कल्पना नहीं कर सकता कि ऐसा करने के लिए एक कंपाइलर की आवश्यकता क्यों होगी। ओपी का उदाहरण फ़ंक्शन पॉइंटर के मामले में भी आसानी से रेखांकित किया जा सकता है। –

+0

'इनलाइन' एक सिफारिश है। यदि संकलक इनलाइन नहीं कर सकता है, तो यह नहीं होगा, और यदि यह नहीं हो सकता है, तो यह अभी भी तय नहीं कर सकता है (और यह 'इनलाइन' कीवर्ड के बिना भी इनलाइन हो सकता है)। फंक्शन पॉइंटर्स आम तौर पर इनलाइनिंग को रोकते हैं, हालांकि इस मामले में संकलक यह पता लगा सकता है कि वे नहीं (या यह परेशान नहीं हो सकता है)। – ugoren

+0

हां, इस मामले में फ़ंक्शन को इनलाइन करना संभव होगा। मुझे लगता है कि यह समस्या का एक सरलीकृत संस्करण था। लेकिन आप सही हैं। – Governa

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