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

2024-01-02

如果我使用以下 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;
}

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

造成这种情况的差异是什么?


_tmainC++ 中不存在。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 定义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 中 _tmain() 和 main() 有什么区别? 的相关文章

随机推荐