_tmain
C ++에는 없습니다. main
그렇습니다.
_tmain
Microsoft 확장입니다.
main
C ++ 표준에 따르면 프로그램의 진입 점입니다. 다음 두 가지 서명 중 하나가 있습니다.
int main();
int main(int argc, char* argv[]);
Microsoft는 두 번째 서명을 다음과 같이 바꾸는 wmain을 추가했습니다.
int wmain(int argc, wchar_t* argv[]);
그런 다음 유니 코드 (UTF-16)와 멀티 바이트 문자 세트를 쉽게 전환 할 수 있도록 _tmain
유니 코드가 활성화 된 wmain
경우로 컴파일 되고 그렇지 않으면로 컴파일되는 것을 정의 했습니다 main
.
질문의 두 번째 부분은 퍼즐의 첫 번째 부분이 주요 기능이 잘못되었다는 것입니다. 아닌 인수를 wmain
취해야합니다 . 컴파일러는 함수에 대해 이것을 강제하지 않기 때문에 문자열 배열을 함수 로 전달 하는 프로그램을 얻습니다.이 문자열은 문자열로 해석 됩니다.wchar_t
char
main
wchar_t
main
char
이제 UTF-16에서 유니 코드가 사용 가능한 경우 Windows에서 사용하는 문자 세트는 모든 ASCII 문자가 바이트 쌍으로 표시되고 \0
ASCII 값이 뒤에옵니다.
x86 CPU는 리틀 엔디안이므로이 바이트의 순서가 바뀌어 ASCII 값이 먼저 온 다음 널 바이트가 뒤 따릅니다.
그리고 char 문자열에서 문자열은 일반적으로 어떻게 종료됩니까? 네, null 바이트입니다. 따라서 프로그램은 1 바이트 길이의 많은 문자열을 봅니다.
일반적으로 Windows 프로그래밍을 수행 할 때 세 가지 옵션이 있습니다.
- 명시 적으로 유니 코드를 사용하십시오 (wmain을 호출하고 char 관련 인수를 취하는 모든 Windows API 함수
-W
에 대해 함수 버전을 호출하십시오 . CreateWindow 대신 CreateWindowW를 호출하십시오). 그리고 char
use wchar_t
등 을 사용 하는 대신
- 유니 코드를 명시 적으로 비활성화하십시오. main 및 CreateWindowA를 호출
char
하고 문자열에 사용하십시오 .
- 둘 다 허용하십시오. (main / _tmain 및 CreateWindowA / CreateWindowW로 해석되는 _tmain 및 CreateWindow를 호출) char / wchar_t 대신 TCHAR을 사용하십시오.
windows.h에 의해 정의 된 문자열 유형에도 동일하게 적용됩니다. LPCTSTR은 LPCSTR 또는 LPCWSTR로 해석되며 char 또는 wchar_t를 포함하는 다른 모든 유형의 경우 항상 대신 사용할 수있는 -T- 버전이 존재합니다.
이 모든 것은 Microsoft에만 해당됩니다. TCHAR은 표준 C ++ 유형이 아니며 windows.h에 정의 된 매크로입니다. wmain 및 _tmain도 Microsoft에서만 정의됩니다.