gpt4 book ai didi

c++ - C++ 中的 _tmain() 和 main() 有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 11:26:28 26 4
gpt4 key购买 nike

如果我使用以下 main() 方法运行我的 C++ 应用程序,一切正常:

int main(int argc, char *argv[]) 
{
cout << "There are " << argc << " arguments:" << endl;

// Loop through each argument and print its number and value
for (int i=0; i<argc; i++)
cout << i << " " << argv[i] << endl;

return 0;
}

我得到了我的期望并且我的论点被打印出来了。

但是,如果我使用 _tmain:

int _tmain(int argc, char *argv[]) 
{
cout << "There are " << argc << " arguments:" << endl;

// Loop through each argument and print its number and value
for (int i=0; i<argc; i++)
cout << i << " " << argv[i] << endl;

return 0;
}

它只显示每个参数的第一个字符。

造成这种情况的区别是什么?

最佳答案

_tmain 在 C++ 中不存在。 main 会。

_tmain 是 Microsoft 扩展。

main 根据 C++ 标准,是程序的入口点。它具有以下两个签名之一:

int main();
int main(int argc, char* argv[]);

Microsoft 添加了一个 wmain,将第二个签名替换为:

int wmain(int argc, wchar_t* argv[]);

然后,为了更容易在 Unicode (UTF-16) 和它们的多字节字符集之间切换,他们定义了 _tmain,如果启用了 Unicode,则将其编译为 wmain,否则为 main.

至于你问题的第二部分,谜题的第一部分是你的主要功能是错误的。 wmain 应该采用 wchar_t 参数,而不是 char。由于编译器不会对 main 函数强制执行此操作,因此您会得到一个程序,其中将 wchar_t 字符串数组传递给 main 函数,它将它们解释为 char 字符串。

现在,在启用 Unicode 时 Windows 使用的字符集 UTF-16 中,所有 ASCII 字符都表示为字节对 \0 后跟 ASCII 值。

由于 x86 CPU 是 little-endian,因此这些字节的顺序被交换,因此 ASCII 值在前,然后是空字节。

在 char 字符串中,字符串通常如何终止?是的,通过一个空字节。所以你的程序会看到一堆字符串,每个字符串长一个字节。

一般来说,在进行 Windows 编程时,您有三种选择:

  • 显式使用 Unicode(调用 wmain,对于每个接受 char 相关参数的 Windows API 函数,调用该函数的 -W 版本。而不是 CreateWindow,调用 CreateWindowW)。而不是使用 char 而是使用 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 定义。

关于c++ - C++ 中的 _tmain() 和 main() 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/895827/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com