2010-01-15 18 views
25

:C++ dize değişmezlerinde _T veya _TEXT kullanmalı mıyım? Örneğin

// This will become either SomeMethodA or SomeMethodW, 
// depending on whether _UNICODE is defined. 
SomeMethod(_T("My String Literal")); 

// Becomes either AnotherMethodA or AnotherMethodW. 
AnotherMethod(_TEXT("My Text")); 

ben hem gördüm. _T netlik için kıskançlık ve _TEXT için görünüyor. Bu sadece öznel bir programcı tercihi mi yoksa daha teknik mi? Örneğin, birini diğerinden kullanırsam, kodum belirli bir sisteme veya bir başlık dosyasının eski bir sürümüne karşı derlenmez mi?

+2

Bunun üzerinde bir visual-C++ etiketi var mı, yoksa _T() uygulamaları arasında yaygın mı? –

+1

Ayrıca Windows başlık dosyalarından bir 'TEXT makrosu (önde gelen alt çizgi) yoktur. Dördüncü (ve en kısa) alternatif, her yerde “geniş” dizeleri (“L”… ”) kullanmaktır — Windows 98/Me, artık yaygın olarak kullanılmamaktadır. Unicode'a taahhüt için – Philipp

cevap

21

SDK basit grep cevabı hiç önemli-onlar değil aynı olmasıdır olduğunu göstermektedir _TEXT için # tanımlanmış olan. Her ikisi de __T(x)'a dönüşüyor.

 
C:\...\Visual Studio 8\VC>findstr /spin /c:"#define _T(" *.h 
crt\src\tchar.h:2439:#define _T(x)  __T(x) 
include\tchar.h:2390:#define _T(x)  __T(x) 

C:\...\Visual Studio 8\VC>findstr /spin /c:"#define _TEXT(" *.h 
crt\src\tchar.h:2440:#define _TEXT(x) __T(x) 
include\tchar.h:2391:#define _TEXT(x) __T(x) 

Ve şeyiyle

:

 
C:\...\Visual Studio 8\VC>findstr /spin /c:"#define __T(" *.h 
crt\src\tchar.h:210:#define __T(x)  L ## x 
crt\src\tchar.h:889:#define __T(x)  x 
include\tchar.h:210:#define __T(x)  L ## x 
include\tchar.h:858:#define __T(x)  x 

Ancak teknik olarak, C yerine _TEXT() ait TEXT() kullanarak olmalıdır ++, ancak (sonunda) çok aynı şey genişler.

+0

İlginç. Sadece aynı değil, aynı başlıkta tanımlanmışlardır. _TEXT'nin Win32 ve _T'nin ATL olduğu konusunda yanlış varsayım vardı. –

+0

@Max: Ayrıca, MAPINls.h ve MAPIWin.h içinde garip bir şekilde tanımlamaktadırlar, fakat neden emin değilim ve yukarıdaki sonuçlardan basit bir şekilde hariç tutuldum. Ama evet, onlar Win32 şeyleri değiller. ATL dokümantasyonu bunu daha iyi sevdiği için kullanabilir mi? ATL size doğru yazmayı kaydetme hakkında mı? :) –

6

Kimseye _TEXT() yerine _T() kullanmak görmedim.

19

Unicode'u onaylayın ve yalnızca L"My String Literal" kullanın.

+6

+1; Microsoft'ta anlamsız kazı için -1. –

+0

Unicode'a dönüştürme, bir kod parçası yazdığınız anda mümkün değildir. Bu arada, _T() kullanılarak hiç kimse dönüştürüldüğünde kodunuzu değiştirmek zorunda kalmaz. –

+0

Hayır, geri dönmek için * hiçbir zaman * iyi bir neden yoktur. –

8

Here 'ın tanınmış ve saygı duyulan bir kaynaktan ilginç bir okuma.

Benzer şekilde, _TEXT makrosu "..." yerine L "..." ile eşler.

_T nedir? Tamam, bunu bilmiyordum. Belki de birilerini yazarak yazmak zorundaydı.

+3

Bir anahtar biti çıkardınız: _TEXT ("merhaba") == UNICODE tanımlanmışsa, SADECE L "merhaba". Ve evet, _T ("merhaba") sadece bir kısaltmadır. – egrunin

+1

Doksanlılara bir zaman yolculuğu planlamıyorsanız, hem UNICODE hem de _UNICODE her zaman tanımlanmalıdır. – Philipp

4

Ne. Tecrübemde iki temel dize değişmezi türü, değişmez olanlar ve kodunuz yerelleştirildiğinde çevrilmesi gerekenler vardır. geri gelip hangi sonradan hangi anlamaya zorunda kalmamak

Bu kod yazmak kadar ikisi arasında ayrım yapmak önemlidir.

yüzden tercüme edilemez dizeleri _UT() ve ZZT() (veya arama yapmak kolaydır başka bir şey) tercüme edilmesi gerekecektir dizeleri kullanır. Kodda _T() veya _TEXT() örnekleri, henüz doğru şekilde kategorize edilmemiş dize değişmezlerinin kanıtıdır.

_UT ve ZZT hem

+0

Dizeleri yerelleştirmek için arama/değiştirme işleminden daha iyi bir sisteme sahip olmalısınız. –

+0

Bu fikri beğeniyorum. Kullanıcıya hangi dizelerin görüntülendiğini (ve bu nedenle çevrilmeli) belirleyen ve günlük dosyalarına (bu olmamalı) giden problemler vardı. –

+0

@Mark: Sizi neden hissettirmiyorsunuz? –

12
Raymond Chen itibaren

: çizgi olmadan düz versiyonları etkileyen _UNICODE

vs

METİN vs _TEXT vs _T ve UNICODE karakter , Windows başlık dosyaları varsayılan olarak tedavi set . Eğer UNICODE tanımlamak Yani, eğer sonra GetWindowText örneğin yerine GetWindowTextA ait GetWindowTextW için eşler. Benzer şekilde, TEXT makro "..." yerine L "..." ile eşlenecektir.

Alt çizgi olan sürümler, C çalışma zamanı başlık dosyalarının varsayılan olarak işleme koyduğu karakter kümesini etkiler. Yani, _UNICODE öğesini tanımlarsanız, _tcslen, örneği için strlen yerine wcslen yerine eşlemini gösterir. Benzer şekilde, _TEXT makro "..." yerine L "..." ile eşlenecektir.

_T nedir? Tamam, bunun hakkında bilmiyorum. Belki de sadece birileri yazarak birileri kurtaran idi.

Kısa versiyon: _T() tembel adamın _TEXT()

Not geçerli:

_TEXT("Some string containing Çontaining"); 
TEXT("€xtended characters."); 

: yazdığınız zaman kaynak kodu bir metin editörü kullanarak hangi kod sayfalık farkında olmak gerekir Derleyicinin gördüğü baytlar, editörünüzün kod sayfasına bağlıdır.

4

Bu makrolar, bir uygulamanın gerçekte hem bir unicode hem de ANSI sürümü oluşturmak istediği günlerden farklıdır.

Bugün bunu yapmanın bir sebebi yok - bunların hepsi körelmiş. Microsoft, her olası konfigürasyonu sonsuza kadar desteklemiş durumdadır, ancak siz öyle değilsiniz. Hem ANSI hem de Unicode için derleme yapmıyorsanız (ve kimse dürüst olamaz) sadece L "text" ile devam edin.

Ve evet, durumda, artık belli değildi: _T == _TEXT

-2

Kullanım ne ve aynı zamanda L "..." bok kullanmayın lütfen. Tüm dizeler için UTF-8 kullanın ve bunları microsoft API'lerine geçmeden hemen önce dönüştürün.

+2

Windows'daki en kötü seçenek milyonlarca gereksiz dizi dönüşüm gerektirecektir. Her zaman UTF-16 kullanın. – Philipp

+0

Kategorik olarak katılmıyorum. Örneğin, http://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful pencerelerde UTF-16'nın neden bozuk olduğunu görün. –

+0

UTF-16 zararlı mı sayılmalıdır? - https://programmers.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful –

İlgili konular