2011-02-02 15 views
9

जीसीसी समर्थन -फोर्ट-वेचर जो 4 से दो बाइट्स तक wchar_t स्विच करता है।जीसीसी के साथ wchar_t कितना बड़ा है?

संकलन समय पर wchar_t के आकार का पता लगाने का सबसे अच्छा तरीका क्या है, इसलिए मैं इसे उचित utf-16 या utf-32 प्रकार में सही तरीके से मैप कर सकता हूं? कम से कम, जब तक C++ 0x जारी नहीं होता है और हमें स्थिर utf16_t और utf_32_t टाइपपीफ देता है।

#if ?what_goes_here? 
    typedef wchar_t Utf32; 
    typedef unsigned short Utf16; 
#else 
    typedef wchar_t Utf16; 
    typedef unsigned int Utf32; 
#endif 
+2

ऐसा मत करो। wchar_t के पास यूनिकोड के साथ कुछ लेना देना नहीं है। यह एक विशिष्ट प्रकार है जो सभी समर्थित स्थानों के सबसे बड़े विस्तारित चरित्र सेट के सभी सदस्यों को पकड़ सकता है। यदि आपका मंच केवल ASCII का समर्थन करता है तो आकार (wchar_t) 1 हो सकता है। इसका मतलब यह भी है कि, उदाहरण के लिए, कि L'mötley crüe 'अनिवार्य रूप से * एक यूनिकोड स्ट्रिंग नहीं है - यह साथ ही साथ लैटिन -1 स्ट्रिंग भी हो सकता है wchar_t। –

+6

यह अब तक की सबसे सार्वभौमिक रूप से अनुपयोगी टिप्पणी है। उस सलाह के आधार पर हमें कभी भी यूटीएफ एन्कोडेड स्ट्रिंग से निपटने का प्रयास नहीं करना चाहिए जब तक कि C++ 0x सार्वभौमिक रूप से रिलीज़ न हो जाए। इस बीच, मुझे प्लेटफार्मों के समर्थन के लिए टाइपिफ के सेट की आवश्यकता है, जो कि आवश्यक डेटा को पकड़ने वाले सबसे उपयुक्त विशिष्ट प्रकारों के लिए मानचित्र है। –

उत्तर

8

आप मैक्रो

__WCHAR_MAX__ 
__WCHAR_TYPE__ 

वे जीसीसी द्वारा परिभाषित कर रहे उपयोग कर सकते हैं। आप echo "" | gcc -E - -dM

साथ उनके मूल्य की जाँच कर सकते __WCHAR_TYPE__ का मूल्य int से short unsigned int या long int भिन्न हो सकते हैं के रूप में, अपने परीक्षण के लिए सबसे अच्छा है, तो __WCHAR_MAX__ ऊपर 2^16 है की जाँच करने के IMHO है।

#if __WCHAR_MAX__ > 0x10000 
    typedef ... 
#endif 
+0

मैं इसे उत्तर के रूप में चिह्नित करता हूं, क्योंकि यह जो मैं ढूंढ रहा था उसके सबसे नज़दीक है। अन्य उत्तर में टेम्पलेट जादू बहुत सारे प्लेटफॉर्म विशिष्ट मैक्रो के बिना और अधिक प्लेटफार्मों का समर्थन करने के लिए एक और अधिक चालाक तरीका प्रतीत होता है –

10
template<int> 
struct blah; 

template<> 
struct blah<4> { 
    typedef wchar_t Utf32; 
    typedef unsigned short Utf16; 
}; 

template<> 
struct blah<2> { 
    typedef wchar_t Utf16; 
    typedef unsigned int Utf32; 
}; 

typedef blah<sizeof(wchar_t)>::Utf16 Utf16; 
typedef blah<sizeof(wchar_t)>::Utf32 Utf32; 
+1

+1। मैं इसे 'struct utf_types' कहूंगा हालांकि :) –

+1

आप क्यों मानेंगे कि एक हस्ताक्षरित छोटा 2 बाइट चौड़ा है और एक हस्ताक्षरित int 4 बाइट्स है, और फिर बस बिना शर्त टाइप किए गए हैं? आप अपनी धारणाओं का आधा दिल से उपयोग कर रहे हैं ... – etarion

+0

@etarion: मैंने बस सवाल का जवाब दिया। Wchar_t सी ++ में एक विशिष्ट प्रकार है (मुझे सी के लिए याद नहीं है) और ओपी (स्पष्ट रूप से) इसका उपयोग करना चाहता है। –

2

के रूप में लुथर ब्लिसेट कहा, wchar_t यूनिकोड से स्वतंत्र रूप से मौजूद है - वे दो अलग बातें हैं।

यदि आप वास्तव में यूटीएफ -16 के बारे में बात कर रहे हैं - तो ध्यान रखें कि यूनिकोड वर्ण हैं जो दो 16-बिट शब्दों (यू + 10000..यू + 10 एफएफएफएफ) के लिए मानचित्र हैं, हालांकि इनका उपयोग पश्चिमी देशों/भाषाओं में शायद ही कभी किया जाता है) । WCHAR_MAX:

2

आप मानक मैक्रो का उपयोग कर सकते हैं

#include <wchar.h> 
#if WCHAR_MAX > 0xFFFFu 
// ... 
#endif 

WCHAR_MAX मैक्रो आईएसओ सी और आईएसओ सी ++ द्वारा परिभाषित किया गया था मानक (देखें: आईएसओ/9899 आईईसी - अन्य पूर्णांक के 7.18.3 सीमाएं प्रकार और आईएसओ/आईईसी 14882 - सी 2), तो आप इसे लगभग सभी कंपाइलरों पर सुरक्षित रूप से उपयोग कर सकते हैं।

1
$ g++ -E -dD -xc++ /dev/null | grep WCHAR 
#define __WCHAR_TYPE__ int 
#define __WCHAR_MAX__ 2147483647 
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1) 
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2 
#define __SIZEOF_WCHAR_T__ 4 
0

आकार संकलक झंडा -fshort-wchar पर निर्भर करता है:

g++ -E -dD -fshort-wchar -xc++ /dev/null | grep WCHAR 
#define __WCHAR_TYPE__ short unsigned int 
#define __WCHAR_MAX__ 0xffff 
#define __WCHAR_MIN__ 0 
#define __WCHAR_UNSIGNED__ 1 
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2 
#define __SIZEOF_WCHAR_T__ 2 
#define __ARM_SIZEOF_WCHAR_T 4 
संबंधित मुद्दे