_tmain
C++ 中不存在。main
does.
_tmain
是微软的一个扩展。
main
根据 C++ 标准,它是程序的入口点。
它具有以下两个签名之一:
int main();
int main(int argc, char* argv[]);
微软添加了一个 wmain 来替换第二个签名:
int wmain(int argc, wchar_t* argv[]);
然后,为了更轻松地在 Unicode (UTF-16) 和多字节字符集之间切换,他们定义了_tmain
如果启用了 Unicode,则编译为wmain
,否则为main
.
至于你问题的第二部分,难题的第一部分是你的主要功能是错误的。wmain
应该采取wchar_t
论证,不char
。由于编译器不会强制执行此操作main
函数,你会得到一个程序,其中有一个数组wchar_t
字符串被传递到main
函数,将它们解释为char
字符串。
现在,在 UTF-16(Windows 启用 Unicode 时使用的字符集)中,所有 ASCII 字符都表示为字节对\0
后面跟着 ASCII 值。
由于 x86 CPU 是小端字节序,因此这些字节的顺序会交换,以便 ASCII 值在前,然后是空字节。
在 char 字符串中,字符串通常如何终止?是的,通过一个空字节。所以你的程序会看到一堆字符串,每个字符串长一个字节。
一般来说,进行 Windows 编程时有以下三种选择:
- 显式使用 Unicode(调用 wmain,对于每个采用 char 相关参数的 Windows API 函数,调用
-W
函数的版本。调用 CreateWindowW 而不是 CreateWindow)。而不是使用char
use wchar_t
, 等等
- 明确禁用 Unicode。调用 main 和 CreateWindowA,然后使用
char
对于字符串。
- 两者都允许。 (调用 _tmain 和 CreateWindow,它们解析为 main/_tmain 和 CreateWindowA/CreateWindowW),并使用 TCHAR 而不是 char/wchar_t。
这同样适用于 windows.h 定义的字符串类型:
LPCTSTR 解析为 LPCSTR 或 LPCWSTR,并且对于包含 char 或 wchar_t 的所有其他类型,始终存在可以使用的 -T- 版本。
请注意,所有这些都是 Microsoft 特定的。 TCHAR 不是标准的 C++ 类型,它是 windows.h 中定义的宏。 wmain 和 _tmain 也仅由 Microsoft 定义。