2009-10-10 6 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 s로 변환 하시겠습니까? 두 선을 합칠 때 왜 작동합니까? 작동 시키려면 무엇을 변경해야합니까?

I가 발생한 일부 다른 혼란 것은

는 :

나는 그것을 위해 인터넷을 검색 한도 _T()_TEXT()__T()__TEXT()이 있음을 보았다. 그들을 위해 무엇입니까? 어떤 환경에서 사용해야합니까?

답변

19

할당이 작동하지 않는 이유는 TCHAR_T과 거의 관련이 없습니다. 다음 중 하나는 작동하지 않습니다.

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

이유는 C 및 C++에서는 배열을 직접 할당 할 수 없기 때문입니다. 대신 요소를 하나씩 복사해야합니다 (예 : strcpy 또는 사용자의 경우 _tcscpy 사용). 귀하의 질문에, TEXT, _T과 다른 사람의 두 번째 부분에 대해서는

strcpy(var, "str"); 

것을는 유니 코드 문자 넓은 문자열 리터럴 문자열을 돌려 구축, 매크로입니다. 비 유니 코드 빌드에서는 아무 것도하지 않습니다.

+1

+1 to avakar. 부가 메모에서 프로젝트 설정 (유니 코드/ASCII)에 따라 WCHAR 또는 char 대신 TCHAR을 사용하십시오. TCHAR 매크로는 WCHAR/char로 정의됩니다. 마찬가지로 _tcscpy_s, _tcscat_s 등과 같은 _t 기반 보안 함수를 사용합니다.이 함수는 프로젝트에 따라 다시 정의됩니다. 설정을 wcscpy 또는 strcpy로 설정하십시오. 내 2 센트. – legends2k

+0

이 오류가 발생했습니다 : 오류 C2664 : 'wcscpy': 'const char [8]'에서 'const wchar_t *'로 매개 변수 2를 변환 할 수 없습니다 –

+0

@ user396483, 무엇을 시도 했습니까? 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
  • 는 유형 별칭입니다 : TCHARtypedef에 지나지 않기 때문에, wcscpy(tszStr, wszAry) 같은 것들을 작성하고 현명 아무도 없을 정말 쉽습니다. 기본적으로 TCHAR입니다. char 또는 wchar_t이므로 과부하 선택이 당신을 놀라게 할 수도 있습니다.
  • wsprintf()swprintf()이 다릅니다. : 이것은 이전의 특수한 경우이지만 여기에서 실수를하기 쉽기 때문에 특별한 고려 사항이 있습니다!

당신이 TCHAR를 사용하려는 경우, 당신은 정기적으로 유니 코드와 MBCS 두 버전을 컴파일 있는지 확인하십시오. 당신이 이것을하지 않으면, 당신은 아마 당신이 우선 그들을 사용하여 얻으려고 어떤 이점을 취소 할 수 있습니다.

다음은 C++ 코드를 작성할 때 TCHAR을 처음 사용하지 않는 방법에 대한 두 가지 권장 사항입니다.

  1. MFC를 사용하거나 MSFT에 자신을 묶는 경우 CString을 사용하십시오.
  2. std::string 또는 std::wstring을 유형별 API와 함께 사용하십시오. 적절한 경우 CreateFileA()CreateFileW()을 사용하십시오.

개인적으로 후자를 선택하지만 문자 인코딩 및 문자열 트랜스 코딩 문제는 수시로 악몽입니다.

+0

+1, 나는 원래 비슷한 호언 장담으로 생각했다. 개인적으로 필자는 utf-8로 인코딩 된 데이터와 함께'std :: string'을 항상 사용하고 API 경계에서만 (즉, win32 API 호출 전에) 코딩합니다. – avakar

+0

@ avakar : UTF-8 + std :: string과 UCS-2 + std :: wstring 방식을 모두 수행했습니다. 나는 UTF-8보다 유니 코드에서 훨씬 쉽습니다. –

관련 문제