c ++ 문자열 리터럴에서 _t 또는 _text를 사용해야합니까?
-
20-09-2019 - |
문제
예를 들어:
// 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" ) );
나는 둘 다 봤다. _t는 간결하고 명확성을 위해 _text 인 것 같습니다. 이것은 단지 주관적인 프로그래머 선호도입니까, 아니면 그보다 더 기술적입니까? 예를 들어, 다른 하나 이상을 사용하면 내 코드가 특정 시스템이나 이전 버전의 헤더 파일에 대해 컴파일하지 않습니까?
해결책
SDK의 간단한 grep은 대답이 그것은 중요하지 않습니다 - 그들은 동일합니다. 그들은 둘 다 바로 변합니다 __T(x)
.
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)
그리고 완전성을 위해 :
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
하지만, 기술적으로, C ++의 경우 사용해야합니다 TEXT()
대신에 _TEXT()
, 그러나 그것은 (결국) 같은 것도 확장됩니다.
다른 팁
유니 코드에 전념하고 그냥 사용하십시오 L"My String Literal"
.
에서 레이몬드 첸:
텍스트 대 _text vs. _t 및 유니 코드 vs. _unicode
밑줄이없는 일반 버전은 캐릭터에 영향을 미칩니다. Windows 헤더 파일이 기본값으로 취급합니다. 따라서 유니 코드를 정의하면 getwindowtext는 예를 들어 getwindowtexta 대신 getwindowtextw에 매핑됩니다. 마찬가지로, 텍스트 매크로는 "..."대신 l "..."에 매핑됩니다.
밑줄이있는 버전은 캐릭터 세트에 영향을 미칩니다. C 런타임 헤더 파일이 기본값으로 취급됩니다. 따라서 _unicode를 정의하면 _tcslen은 예를 들어 strlen 대신 wcslen에 매핑됩니다. 마찬가지로 _text 매크로는 "..."대신 l "..."에 매핑됩니다.
_t는 어떻습니까? 좋아, 나는 그것에 대해 모른다. 어쩌면 누군가가 타이핑을 저장하는 것일 수도 있습니다.
짧은 버전 : _T()
게으른 사람입니다 _TEXT()
참고 : 글을 쓸 때 소스 코드 텍스트 편집기를 사용하는 코드 페이지를 알고 있어야합니다.
_TEXT("Some string containing Çontaining");
TEXT("€xtended characters.");
컴파일러가 보는 바이트는 편집기의 코드 페이지에 따라 다릅니다.
여기잘 알려진 존경받는 출처의 흥미로운 읽기입니다.
마찬가지로 _text 매크로는 "..."대신 l "..."에 매핑됩니다.
_t는 어떻습니까? 좋아, 나는 그것에 대해 모른다. 어쩌면 누군가가 타이핑을 저장하는 것일 수도 있습니다.
나는 아무도 사용하는 것을 본 적이 없다 _TEXT()
대신에 _T()
.
어느 것도 아니다. 내 경험에는 두 가지 기본 유형의 문자 리터럴이 있으며, 변하지 않는 문자 및 코드가 현지화 될 때 번역 해야하는 것입니다.
코드를 작성할 때 둘을 구별하는 것이 중요하므로 돌아와서 나중에 어느 쪽인지 알아낼 필요가 없습니다.
그래서 나는 사용한다 _UT()
번역 할 수없는 줄의 경우, 그리고 ZZT()
(또는 검색하기 쉬운 다른 것) 번역해야 할 문자열. 인스턴스 _T()
또는 _TEXT()
코드에는 아직 올바르게 분류되지 않은 문자 리터럴의 증거가 있습니다.
_UT
그리고 ZZT
둘 다 #Text로 정의되었습니다
이 매크로는 응용 프로그램이 실제로 유니 코드와 ANSI 버전을 컴파일하기를 원했던 시절부터 보류됩니다.
오늘이 일을 할 이유가 없습니다. 이것은 모든 흔적입니다. Microsoft는 가능한 모든 구성을 영원히 지원하는 데 갇혀 있지만 그렇지 않습니다. ANSI와 유니 코드 모두에 컴파일하지 않는다면 (아무도 솔직히 말해서) L "텍스트"로 가십시오.
그리고 네, 지금까지 명확하지 않은 경우 : _t == _text
또한 사용하지 않고 L "..."쓰레기를 사용하지 마십시오. 모든 문자열에 UTF-8을 사용하고 Microsoft API로 전달하기 직전에 변환하십시오.