2009-02-14 16 views
14

मैं एप्पल के ScriptingBridge ढांचे के साथ काम कर रहा हूँ, और कहा कि इस तरह कई enum रों शामिल iTunes के लिए एक हेडर फाइल उत्पन्न किया है:एनम किस प्रकार का मूल्य स्ट्रिंग प्रतीत होता है?

typedef enum { 
    iTunesESrcLibrary = 'kLib', 
    iTunesESrcIPod = 'kPod', 
    iTunesESrcAudioCD = 'kACD', 
    iTunesESrcMP3CD = 'kMCD', 
    iTunesESrcDevice = 'kDev', 
    iTunesESrcRadioTuner = 'kTun', 
    iTunesESrcSharedLibrary = 'kShd', 
    iTunesESrcUnknown = 'kUnk' 
} iTunesESrc; 

मेरे समझ के साथ कि enum मान पूर्णांक की तरह होना था था, लेकिन इस परिभाषा लगता है उस नियम का उल्लंघन करने के लिए। इसके अलावा, ऐसा लगता है कि इन enum मानों को पूर्णांक के रूप में मानते हैं (उदाहरण के लिए NSPredicate में) सही काम नहीं करता है।

मैं एक खाली main समारोह के साथ एक सी फाइल करने के लिए ऊपर enum घोषणा जोड़ा, और यह i686-apple-darwin9-gcc-4.0.1 का उपयोग कर संकलित। इसलिए, इस प्रकार के enum एस सी मानक के अनुरूप नहीं हो सकते हैं (जैसा कि पैराप्पा नीचे बताए गए हैं), कम से कम कुछ जीसीसी द्वारा टाइप किए गए हैं।

तो, उस प्रकार का क्या है, और उदाहरण के लिए, मैं प्रारूप स्ट्रिंग में इसका उपयोग कैसे कर सकता हूं?

उत्तर

18

C99, TC3 पढ़ता है:

6.4.4.4 §2:

एक पूर्णांक चरित्र लगातार एकल उद्धरण में संलग्न एक या अधिक multibyte वर्णों का एक क्रम है, 'एक्स में के रूप में '। [...]

6.4.4.4 §10:

एक पूर्णांक चरित्र निरंतर प्रकार int है। एक पूर्णांक वर्ण स्थिरांक का मान जिसमें एक एकल वर्ण होता है जो एकल-बाइट निष्पादन वर्ण को मैप करता है, मैप किए गए वर्ण के प्रतिनिधित्व का संख्यात्मक मान पूर्णांक के रूप में व्याख्या किया जाता है। एक पूर्णांक वर्ण स्थिरांक का मान जिसमें एक से अधिक वर्ण होते हैं (उदा।, 'Ab'), या एक वर्ण या भागने वाला अनुक्रम होता है जो एकल-बाइट निष्पादन वर्ण को मैप नहीं करता है, कार्यान्वयन-परिभाषित है। यदि एक पूर्णांक चरित्र निरंतर एक एकल वर्ण या भागने अनुक्रम होता है, तो इसका मान वह होता है जिसके परिणामस्वरूप टाइप ऑर के साथ ऑब्जेक्ट होता है जिसका मान एकल वर्ण या भागने अनुक्रम का होता है जिसे int int में परिवर्तित किया जाता है।

अधिकांश कार्यान्वयन में, 4 वन-बाइट वर्णों के पूर्णांक वर्ण स्थिरांक का उपयोग करना सुरक्षित है। हालांकि वास्तविक मूल्य अलग-अलग प्रणालियों (अंतहीनता) के बीच भिन्न हो सकता है।


यह वास्तव में पहले से ही एएनएसआई-C89 मानक में परिभाषित किया गया है, खंड 3.1.3.4:

एक पूर्णांक चरित्र निरंतर, एकल उद्धरण में संलग्न एक या अधिक multibyte वर्णों का एक क्रम है 'x' या 'ab' में के रूप में। [...]

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

+0

अच्छा - कुछ आधिकारिक। :) –

+0

यह एक आम, लेकिन गैर-पोर्टेबल, गैर-मानक एक्सटेंशन सी 99 से पहले भी था। – dmckee

+1

@ डीएमकी: बहु-बाइट वर्ण स्थिरांक पहले से ही एएनएसआई-सी 8 9 का हिस्सा थे (खंड 3.1.3.4 देखें), इसलिए यह हमेशा मानक रहा है! – Christoph

6

सिंगल कोट्स सी में तारों की बजाय अक्षर इंगित करते हैं। इसलिए प्रत्येक enums में 32 बिट मान होंगे जिसमें चार वर्णों के लिए वर्ण कोड शामिल होंगे। वास्तविक मूल्य चरित्र एन्कोडिंग में निर्भर करेगा, लेकिन मैं 8 बिट अक्षर मान रहा हूं। ध्यान दें नहीं संलग्न \ 0 है।

आप सामान्य तुलना/असाइनमेंट उद्देश्यों के लिए enums का उपयोग कर सकते हैं। किसी भी enum के साथ अंतर्निहित प्रकार पूर्णांक है।

मैंने 4 तकनीक 'नाम' बनाने के लिए कई बार एम्बेडेड सिस्टम में इस तकनीक का उपयोग किया है जो हेक्स डंप/डीबगर संदर्भों में मानव पठनीय थे।

0

सेल्सियस के लिए एक एप्पल विस्तार है, जो यह मूल रूप से करने के लिए उन enums तब्दील है:

typedef enum { 
    iTunesESrcLibrary = 'k'<<24 | 'L'<<16 | 'i'<<8 | 'b', 
... 
} 

संपादित करें: क्षमा करें, जाहिरा तौर पर यह मान्य सी मैं केवल मैक कोड में उन्हें लगता है, इसलिए गलत तरीके से है माना जाता है कि यह ऐप्पल विशिष्ट था।

+0

नहीं, यह मान्य ISO-सी है! – Christoph

+0

यह केवल एक ऐप्पल एक्सटेंशन नहीं है। मैंने इसे कई सी कंपाइलर्स और एआरएम में उपयोग किया है, सेक 2.5.2 इंगित करता है कि यह वैध सी ++ है। एक सी spec आसान नहीं है। लेकिन आप आमतौर पर मूल्य व्याख्या के बारे में सही हैं। आधिकारिक तौर पर यह कार्यान्वयन निर्भर है। –

+0

धन्यवाद, पता नहीं था, लिनक्स में जीसीसी हालांकि इसके बारे में चेतावनी देता है। – codelogic

2

जैसा कि पहले से ही कहा गया है, वे वर्ण स्थिरांक का उपयोग करके घोषित पूर्णांक हैं।

जब एक से अधिक वर्णों के चरित्र स्थिरांक का उपयोग करके एक पूर्णांक घोषित किया जाता है, तो यह उस मशीन के byte order के प्रति संवेदनशील होता है जिसके लिए निरंतर विकसित किया गया था। चूंकि सभी मूल मैक एपीआई पीपीसी या पूर्व मशीनों पर थे, वे इंटेल Little-Endian मशीनों के संबंध में पीछे की ओर हैं।

आप केवल इंटेल के लिए निर्माण कर रहे हैं, तो आप सिर्फ हाथ से क्रम को उल्टा कर सकते हैं।

यदि आप एक सार्वभौमिक बाइनरी बना रहे हैं तो आपको flipping function जैसे CFSwapInt32BigToHost का उपयोग करने की आवश्यकता है। उन कोड को दूर करने के

विफलता कोड है कि केवल PowerPC मशीनों पर काम कर सकता था, संकलक त्रुटियों की कमी की परवाह किए बिना के साथ छोड़ जाएगा।