2010-08-26 13 views
10

तो मेरे पास एक ऐप है जो विंडोज़, लिनक्स और यूनिक्स के कुछ बदलावों पर ठीक से संकलित करता है। मैंने हाल ही में ओएसएक्स को पोर्ट करने का फैसला किया जब मैं एक झगड़ा में भाग गया।क्या सी ++ मानक पुस्तकालय में सभी कार्यों के लिए बाहरी संबंध होना आवश्यक है?

मैं जो इस तरह दिखता है एक टेम्पलेट है:

template<int (&F)(int)> 
int safe_ctype(unsigned char c) { return F(c); } 

विचार कुछ कार्यान्वयन दुर्घटनाग्रस्त जब 0x7f ऊपर इनपुट मानों दिया से संकेत विस्तार को रोकने के लिए किया जा रहा है। यह आम तौर पर इस तरह प्रयोग किया जाता है:

safe_ctype<std::isspace>(ch); 

यह दुर्भाग्य पर OSX काम नहीं करता है (जीसीसी 4.2 का उपयोग)। त्रुटि को std::isspace के साथ बाहरी संबंध नहीं है और इसलिए टेम्पलेट्स के लिए लागू नहीं है। यह पता चला है कि ओएसएक्स पर, ctype.h हेडर में सभी फ़ंक्शन (मैक्रोज़ के माध्यम से) static inline चिह्नित हैं।

इसे करने के लिए मानक पुस्तकालय बाहरी संबंध नहीं है (इस मामले भागों सी से विरासत में मिला में) सी ++ में कार्यों के लिए किसी भी प्रासंगिक मानक द्वारा अनुमति दी है:

यहाँ मेरे सवाल है?

संपादित करें:

मैं सेब से वापस सुना है। स्पष्ट रूप से उनके पास इस व्यवहार को नियंत्रित करने के लिए एक मैक्रो है। _DONT_USE_CTYPE_INLINE_ परिभाषित करने से ctype फ़ंक्शंस स्थिर इनलाइन होने से रोकता है।

+0

यदि आप सख्त मानकों मोड में संकलन तुम भी मानक व्यवहार मिल जाएगा। –

उत्तर

18

सी ++ 03 §17.4.2.2/1 का कहना है:

सी ++ मानक पुस्तकालय में

संस्थाओं बाहरी संबंध है।

एक ही सी में सत्य है: C99 §7.1.2/6 का कहना है:

एक पुस्तकालय समारोह का कोई भी घोषणा बाहरी संबंध नहीं होगा।

+2

+1: मैं मैं '' उपयोग कर रहा हूँ स्टैंडर्ड – Chubsdad

0

कैसे "cctype" (मैं कोण कोष्ठक के भीतर मतलब) के बजाय का उपयोग कर के बारे में "ctype.h" फिर भी, एक पुराने styed हैडर मुझे लगता है कि होगा।

+0

के लिए संदर्भ प्यार लेकिन त्रुटि '' सहित कि से निकलती है। –

+0

@ ईवन टेरन: हम सभी को यह बताएं कि आपने इस मुद्दे को कैसे हल किया है। // बग रिपोर्ट: – Chubsdad

+0

मैं सेब (https के साथ एक बग रिपोर्ट दायर किया है।apple.com/cgi-bin/WebObjects/RadarWeb.woa/9/wo/6aVZoNoJkJwq5qhwL0J7Bw/10.60)। इस बीच मैं ओएसएक्स पर संकलित होने पर आधारित फ़ंक्शन को सीधे या टेम्पलेट के माध्यम से कॉल करने के लिए मैक्रो का उपयोग कर रहा हूं। आदर्श समाधान नहीं है, लेकिन अब यह काफी अच्छा है। –

3

ओएस एक्स <ctype.h> हेडर गैर-मानक इनलाइन संस्करणों को उस चेक के साथ सुरक्षित करता है जिसे आप मानक मोड में संकलित नहीं कर रहे हैं।

यदि आप संकलक को नहीं बताते हैं तो आप अनुरूपता चाहते हैं, तो आपको अनुरूपता नहीं मिलती है। यह लगभग सभी प्लेटफार्मों पर सच है, हालांकि विभिन्न तरीकों से।

आप एक्सटेंशन के सभी ब्योरा है और क्या नहीं है, और इसलिए सख्त अनुरूपता की आवश्यकता नहीं करना चाहती चाहते हैं, आप शीर्ष लेख शामिल करने से पहले _DONT_USE_CTYPE_INLINE_ परिभाषित कर सकते हैं और आप बाहरी लिंकेज के साथ कार्यों की गैर इनलाइन संस्करणों मिल जाएगा।

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