तो मेरे पास एक ऐप है जो विंडोज़, लिनक्स और यूनिक्स के कुछ बदलावों पर ठीक से संकलित करता है। मैंने हाल ही में ओएसएक्स को पोर्ट करने का फैसला किया जब मैं एक झगड़ा में भाग गया।क्या सी ++ मानक पुस्तकालय में सभी कार्यों के लिए बाहरी संबंध होना आवश्यक है?
मैं जो इस तरह दिखता है एक टेम्पलेट है:
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 फ़ंक्शंस स्थिर इनलाइन होने से रोकता है।
यदि आप सख्त मानकों मोड में संकलन तुम भी मानक व्यवहार मिल जाएगा। –