2009-10-10 26 views
14

C++ kodumda statik dizeler atamak istediğim bir TCHAR dizilim var. TCHAR dizisine nasıl değer atanır?

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

Her şey bu üzerinde çalışıyor

aracılığıyla kendisine bir ilk dize ayarlayın. Ancak, ne zaman

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

o böcek gibi iki hatlarında bölmek ve bir derleyici hata veriyor:

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

TEXT() işlevi burada tam olarak ne istiyorsun ki? Verilen dize TCHAR s dönüştürmek? İki çizgiyi birleştirirken neden işe yarıyor? Çalışmak için ne değiştirmek zorundayım?

karşılaştığım diğer bazı kafa karıştırıcı şey

:

bunun için internet arama ettik ve ayrıca _T() ve _TEXT() ve __T() ve __TEXT() olduğunu gördük. Onlar ne için? Hangi ortamda kullanmalıyım?

cevap

19

Atamanın çalışmadığı neden TCHAR s ve _T ile çok az şey yapmıştır. Aşağıdakiler de işe yaramaz.

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

Bunun nedeni, C ve C++ 'da dizileri doğrudan atayamazsınız. Bunun yerine, öğeleri tek tek kopyalamanız gerekir (örneğin, strcpy veya sizin durumunuzda _tcscpy). Sorunuzun, TEXT, _T ve diğerleri ikinci bölümünde İlişkin

strcpy(var, "str"); 

o Unicode değişmez geniş dize hazır bilgi bir dize çevirmek kurar, makrolardır. Unicode olmayan yapılarda hiçbir şey yapmazlar.

+1

+1 to avakar. Bir yan notta, proje ayarlarınıza (Unicode/ASCII) bağlı olarak WCHAR veya char yerine TCHAR kullanın, TCHAR makrosu WCHAR/char olarak tanımlanır. Ve benzer şekilde, projenize göre yeniden tanımlanacak _tcscpy_s, _tcscat_s, vb. Gibi _t tabanlı güvenli işlevler kullanın. wcscpy veya strcpy olarak ayarlar. Benim 2 kuruş. – legends2k

+0

Bunu denedim, bu hatayı aldım: hata C2664: 'wcscpy': 'const char [8]' den 'const wchar_t *' –

+0

@ user396483 'e parametre 2'yi dönüştüremiyor, ne denedi? Açıkçası str, _tcs ve wcs versiyonlarını karıştırıyorsunuz. – 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.

gerçekten TCHAR diziler ve arkadaşlarına kullanmanın etkisini anlamak emin olun. Doğru bir şekilde kullanmak oldukça aldatıcıdır.

  • sizeof(TCHAR) şarta bağlı: Bu içeren kod incele Burada dikkat etmeniz gereken şeylerden kısa listesidir. malloc() veya memcpy()'a geçirilen boyuttan başka bir şey yapmıyorsa, muhtemelen yanlıştır.
  • TCHAR
  • bir tür takma geçerli: TCHAR bir typedef başka bir şey olduğundan, wcscpy(tszStr, wszAry) gibi şeyler yazmak ve hiçbiri akıllıca olması gerçekten çok kolaydır. Temel olarak, , char veya wchar_t için veya aşırı yükleme seçimleri sizi şaşırtabilir.
  • wsprintf() ve swprintf() farklıdır: Bu, önceki özel bir durumdur ancak burada bir hata yapmak çok kolay olduğu için özel bir önem taşımaktadır!

Eğer TCHAR kullanmak istiyorsanız, o zaman düzenli UNICODE ve MBCS her iki sürümün derleme emin olun. Bunu yapmazsanız, muhtemelen ilk etapta bunları kullanarak kazanmaya çalıştığınız herhangi bir avantajı geri alacaksınız.

Burada C++ kodu yazarken ilk etapta TCHAR'u kullanmama konusunda sahip olduğum iki öneri var.

  1. Eğer MFC kullanıyorsanız veya MSFT'ye bağlı olarak kendinizi rahat hissediyorsanız, CString kullanın. Uygunsa, türe özgü API ile birlikte std::string veya std::wstring kullanın veya CreateFileA() ve CreateFileW() kullanın.

Şahsen ben onu seçiyorum ama karakter kodlaması ve dizgisi kod çevrimi sorunları zaman zaman bir kabus.

+0

+1, aslında benzer bir rant yazmayı düşündüm. Şahsen, ben her zaman std :: string'i utf-8 kodlu veri ile kullanırım, sadece API sınırlarında (yani win32 API'sine yapılan çağrılardan önce) kayıt yaparım. – avakar

+0

@avakar: Hem UTF-8 + std :: string hem de UCS-2 + std :: wstring yaklaşımını yaptık. Unicode'da katlama ve karşılaştırmalar UTF-8'den çok daha kolay olduğundan bu yana daha sonra aldım. –

İlgili konular