2013-02-17 5 views
10

मुझे पता है कि फ़ंक्शन पर static कीवर्ड का उपयोग करके फ़ंक्शन को संकलन इकाई में प्रतिबंधित करता है जिसमें इसे परिभाषित किया जाता है। अब मैं प्रतीक दृश्यता में देख रहा हूं, और static फ़ंक्शन और __attribute__((visibility("hidden"))) के साथ चिह्नित फ़ंक्शन और -fvisibility=hidden कमांड-लाइन विकल्प का उपयोग करके मैं थोड़ा उलझन में हूं।स्थिर कार्य और "छिपी हुई" दृश्यता विशेषता के साथ एक फ़ंक्शन के बीच व्यावहारिक अंतर क्या है?

मुझे एहसास है कि जिस तरह से इन परिवर्तनों के तहत चीजें बदलती हैं, वही नहीं है, लेकिन मुझे नहीं पता कि अंतर क्या है और न ही वास्तविक कोड में उनके साथ काम करते समय इसका क्या अर्थ है। दोनों के बीच क्या परिवर्तन होता है, और आप दूसरे पर एक का उपयोग कब करना चाहते हैं?

उत्तर

12

__attribute__((visibility("hidden"))) के साथ एक समारोह साझा लाइब्रेरी यह युक्त बाहर दिखाई नहीं देता है, लेकिन अगर यह है कि पुस्तकालय foo.pic.o और bar.pic.o जोड़ने इस तरह के एक समारोह fhidfoo.c में परिभाषित किया जा सकता है और bar.c से बुलाया द्वारा किया गया था। बेशक कोड के बाहर (उदाहरण के लिए मुख्य कार्यक्रम या कुछ अन्य साझा लाइब्रेरी से) उस fhid

पर कॉल नहीं कर सकता है इसलिए छुपा दृश्यता पूरी साझा लाइब्रेरी पर लागू होती है, न कि व्यक्तिगत संकलन इकाइयों को लिखने के लिए।

इसके विपरीत, यह संभव होता है foo.c एक static void fsta(void) समारोह को परिभाषित करने के लिए, और bar.c के लिए एक अलगstatic void fsta(void) समारोह को परिभाषित करने के (है कि भले ही गरीब स्वाद है और पठनीयता कारणों से परहेज किया जाना चाहिए)।

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

+0

लेकिन डीएलएल +1 –

0

हिडन दृश्यता इंगित करता है कि प्रतीक गतिशील प्रतीक तालिका में नहीं रखा जाएगा, ताकि कोई अन्य "मॉड्यूल" (निष्पादन योग्य या साझा लाइब्रेरी) यह सीधे संदर्भित कर सकते हैं।

http://ohse.de/uwe/articles/gcc-attributes.html

मैं जोड़ सकते हैं: आप static की सी संस्करण के करीब अर्थ विज्ञान के साथ C++ में __attribute__((visibility("hidden"))) उपयोग कर सकते हैं।

+0

के बाहर से नहीं, बिल्कुल नहीं: आपके पास दो अलग-अलग संकलन इकाइयों में एक ही नाम 'एफ' के दो अलग-अलग' स्थिर 'कार्य हो सकते हैं। छुपे हुए दृश्यता के साथ आपके पास 2 ऐसे फ़ंक्शन 'f' नहीं हो सकते हैं –

4

आप केवल साझा लाइब्रेरी के संदर्भ में इस्तेमाल किया जा करना चाहते हैं यदि आप एक साझा लाइब्रेरी में कोई global समारोह है, तो, लेकिन साझा लाइब्रेरी के बाहर - तो आप __attribute__((visiblity("hidden")))

उदाहरण के लिए की जरूरत है:

आप एक समारोह void foo()Foo.c में परिभाषित किया गया है और आप इसे Bar.c और Baz.c जो FooBarBaz.dll (या FooBarBaz.so) का निर्माण करने के संकलन इकाइयां हैं से उल्लेख करना चाहते हैं तो आप

के रूप में कार्य कर सकते हैं

याद रखें, foo() निष्पादन योग्य को दिखाई नहीं देगा जो dll (या।तो फ़ाइल) इसे पढ़ें paper

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