2009-10-10 14 views
14

पर कोई मान कैसे असाइन करें मेरे पास मेरे C++ कोड में TCHAR सरणी है जो मैं इसे स्थिर स्ट्रिंग असाइन करना चाहता हूं।एक TCHAR सरणी

मैं

के माध्यम से इसे करने के लिए एक प्रारंभिक स्ट्रिंग सेट
TCHAR myVariable[260] = TEXT("initial value"); 

सब कुछ इस पर ठीक काम करता है। हालांकि, जब मैं इसे दो पंक्तियों में

TCHAR myVariable[260]; 
myVariable = TEXT("initial value"); 

यह कीड़े के रूप में विभाजित है और एक संकलक त्रुटि देता है:

error C2440: '=': cannot convert from 'const char [14]' to 'TCHAR [260]'

नहीं TEXT() समारोह है कि वास्तव में क्या मैं यहाँ चाहते हैं चाहिए? दिए गए स्ट्रिंग को TCHAR एस में कनवर्ट करें? दो लाइनों को एक साथ रखकर, यह क्यों काम करता है? इसे काम करने के लिए मुझे क्या बदलना है?

कुछ अन्य भ्रामक बात मैं सामना करना पड़ा:

मैं इसके लिए इंटरनेट खोज की है और देखा है वहाँ भी कर रहे हैं कि _T() और _TEXT() और __T() और __TEXT()। यह किस लिए हैं? मुझे किस पर्यावरण में उपयोग करना चाहिए?

उत्तर

19

असाइनमेंट काम नहीं करता है TCHAR एस और _T के साथ बहुत कम करना है। निम्नलिखित या तो काम नहीं करेगा।

char var[260]; 
var = "str"; // fails 

कारण यह है कि सी और सी ++ में आप सीधे सरणी निर्दिष्ट नहीं कर सकते हैं। इसके बजाए, आपको तत्वों को एक-एक करके कॉपी करना होगा (उदाहरण के लिए, strcpy, या आपके मामले में _tcscpy)।

strcpy(var, "str"); 

अपने प्रश्न, TEXT, _T और दूसरों के दूसरे भाग के बारे में मैक्रो नहीं है, कि यूनिकोड में एक स्ट्रिंग एक व्यापक स्ट्रिंग शाब्दिक को शाब्दिक बारी बनाता है। गैर-यूनिकोड में वे कुछ भी नहीं करते हैं।

+1

+1 avakar के लिए +1। एक साइड नोट पर, अपनी परियोजना सेटिंग्स (यूनिकोड/ASCII) के आधार पर, WCHAR या char के बजाय TCHAR का उपयोग करें, टीसीएचएआर मैक्रो को WCHAR/char के रूप में परिभाषित किया जाएगा। और इसी तरह _tcscpy_s, _tcscat_s, आदि जैसे _t आधारित सुरक्षित फ़ंक्शंस का उपयोग करें जिन्हें आपके प्रोजेक्ट के आधार पर फिर से परिभाषित किया जाएगा। wcscpy या strcpy के रूप में सेटिंग्स। मेरा 2 सेंट। – legends2k

+0

मैंने यह कोशिश की, यह त्रुटि मिली: त्रुटि C2664: 'wcscpy': 'const char [8]' से 'const wchar_t *' –

+0

@ user396483 से पैरामीटर 2 को परिवर्तित नहीं कर सकता, क्या प्रयास किया? आप स्पष्ट रूप से str, _tcs और wcs संस्करणों को एक साथ मिश्रित कर रहे हैं। – avakar

5

See avakar's answer for the direct answer. I was going to add this as a comment, but it really is a freestanding recommendation. I will warn you up from that this will sound like a rant but it does come from using TCHAR and then working issues for a few years before trying to remove it from a rather large codebase.

सुनिश्चित करें कि आप वास्तव में TCHAR सरणियों और उनके दोस्तों का उपयोग कर के प्रभाव को समझने कि सुनिश्चित करें। वे सही ढंग से उपयोग करने के लिए भ्रामक रूप से मुश्किल हैं।

  • sizeof(TCHAR) सशर्त है: कोड है कि इस में शामिल है बारीकी से जांच करें यहाँ चीजों के लिए बाहर देखने के लिए कि आप की एक छोटी सूची है। यदि यह malloc() या memcpy() पर जा रहे आकार की गणना करने के अलावा कुछ और कर रहा है तो यह शायद गलत है।
  • TCHAR एक प्रकार उर्फ ​​ है: चूंकि TCHAR एक typedef से ज्यादा कुछ नहीं है, यह वास्तव में wcscpy(tszStr, wszAry) तरह बातें लिख सकते हैं और कोई भी समझदार होने के लिए आसान है। असल में, TCHARया तोchar या wchar_t इसलिए अधिभार चयन आपको आश्चर्यचकित कर सकते हैं।
  • wsprintf() और swprintf() अलग-अलग हैं: यह पिछले का एक विशेष मामला है लेकिन यह विशेष विचार है क्योंकि यहां गलती करना इतना आसान है!

आप TCHAR उपयोग करना चाहते हैं, तो सुनिश्चित करें कि आप दोनों यूनिकोड और MBCS संस्करणों नियमित रूप से संकलित हैं। यदि आप ऐसा नहीं करते हैं, तो संभवतः आप किसी भी लाभ को पूर्ववत करने जा रहे हैं जिसे आप पहले स्थान पर उपयोग करके हासिल करने का प्रयास कर रहे हैं।

यहां दो सिफारिशें हैं जिनके पास आपके पास C12+ कोड लिखने पर पहली बार TCHAR का उपयोग नहीं करना है।

  1. यदि आप एमएफसी का उपयोग कर रहे हैं या एमएसएफटी को अपने आप को बांधने में सहज हैं तो CString का उपयोग करें।
  2. टाइप-विशिष्ट एपीआई के संयोजन के साथ std::string या std::wstring का उपयोग करें - CreateFileA() और CreateFileW() का उपयोग करें जहां उचित हो।

व्यक्तिगत रूप से, मैं बाद वाला चुनता हूं लेकिन चरित्र एन्कोडिंग और स्ट्रिंग ट्रांसकोडिंग मुद्दे समय-समय पर एक दुःस्वप्न हैं।

+0

+1, मैं मूल रूप से एक समान रेंट लिखने पर विचार किया। निजी तौर पर, मैं हमेशा यूटीएफ -8 एन्कोडेड डेटा के साथ 'std :: string' का उपयोग करता हूं, केवल एपीआई सीमाओं पर रिकोडिंग (यानी Win32 API को कॉल करने से पहले)। – avakar

+0

@avakar: हमने यूटीएफ -8 + std :: स्ट्रिंग और यूसीएस -2 + std :: wstring दृष्टिकोण दोनों किया है। यूसीएफ -8 की तुलना में यूनिकोड में केस फोल्डिंग और तुलना बहुत आसान है क्योंकि मैंने बाद में ले लिया है। –