2017-11-17 5 views
1

Windows C++ 멀티 바이트/유니 코드 고려 사항에서 멀티 바이트 또는 유니 코드로 컴파일하는지 여부에 관계없이 _tcslen() 및 lstrlen()이 모두 문자열 길이를 올바르게 제공합니다.Windows C++ multibyte/unicode

_tcslen()은 _UNICODE def에 따라 TCHAR.H에 정의되고 lstrlen()은 def UNICODE에 따라 WINBASE.H에 정의됩니다.

누군가가 어떤 시점에서 휠을 다시 발명했거나이 명백한 복제가 필요한 이유가 있습니까?

+0

https://www.codeproject.com/Messages/2654087/Whats-the-differences-between-lstrlen-and-_tcslen.aspx –

+0

아니요, 해당 매크로는 ANSI (char) 또는 멀티 바이트 (wchar) 함수 및 유형. 중복이 없으며 90 년대 초반부터 사람들이 ANSI 또는 유니 코드와 동일한 코드를 컴파일 할 수 있도록 매크로를 다시 작성했습니다. OS는 Windows NT 이전에 유니 코드를 사용하지 않았다는 것을 기억하십시오. C++은 2011 년'char16_t','char32_t','std :: u16string' 및'std :: u32string' 유형으로 만 유니 코드를 추가했습니다. –

+1

어쨌든 C++에서'lstrlen'이나'_tcslen' 같은 C 함수와 타입을 혼합해서는 안됩니다. 언어의 유형과 알고리즘을 사용해야합니다. [std :: string.length()] (http://www.cplusplus.com/reference/string/string/length/) 또는 [u16string.length()] (http://www.cplusplus.com/)를 사용하십시오. 참조/문자열/u16string /). 타입 유추에'auto'를 사용해야합니다. 사용하지 않고 쉽게 누출 될 수있는 원시 포인터 대신 [unique_ptr] (http://en.cppreference.com/w/cpp/memory/unique_ptr)과 함께 참조 및 스마트 포인터를 전달하십시오. 포인터 연산 대신 반복자 –

답변

1

lstrlen 및 기타 lstrxxx은 Windows API입니다. 그들은 ANSI 및 유니 코드 버전 lstrlenAlstrenW 있습니다. 그들은 Windows 3.1의 시대에 strlen 이상의 몇 가지 장점을 가지고있었습니다. 그들은 지금 어떤 이점도 가지고 있지 않습니다. 이러한 함수를 사용하여 코드를 작성하면 C의 표준과 호환되지 않으며 Windows에서만 컴파일됩니다.

_tstrlen

에서는 Windows 95 ANSI로 컴파일 할 수있는 코드의 한 세트를 작성할 수 있기 때문에 1990 년대와 2000 년대 초반에 유용 C. 표준 ANSI strlen 또는 유니 코드 wcslen 중 하나에 대한 매크로이며, 유니 코드 Windows NT. 또한 Microsoft는 ANSI 및 유니 코드 모두에 대해 한 세트의 설명서를 작성할 수 있기 때문에 유용합니다.

그렇지 않으면 _tstrxxx 문자열 매크로와 TCHAR 등은 더 이상 유용하지 않습니다. 당신은 C.

표준 그러나 그런 다음, * nix에서 스크립트를 운영 체제에서 사용하는 "와이드 C-문자열"wcsxxx 기능을 사용할 단지 수있는 Windows 95 호환되는 코드를 작성하는이 모든 고통을 통해 갈 아무 소용이 없다 UTF-8 및 strxxx 기능 UTF-16 및 wcsxxx을 사용하는 Windows와는 대조적입니다. 당신이 _tstrxxx 매크로를 사용하여 * nix와 Windows 모두에서 유니 코드 호환 코드를 작성할 수 있다고 가정합니다. 다른 프로그래머는 _tstrxxx 매크로로 혼란 스럽겠지만 최소한 코드를 컴파일 할 확률이 더 큽니다!

+0

이 다중 사용 매크로를 사용하는 이유는 ~ 1000 DLL이 모두 포함 된 Windows C++ 프로젝트에 새 DLL을 추가하기 때문입니다. 내 DLL은 유니 코드 프로젝트에서 나중에 재사용 될 수 있습니다. –