为什么有一个定义_t​​main的宏?

Sam*_*erg 7 c++ macros tchar character-encoding visual-c++

我是C++编码的新手,来自Java和C#背景.我对最基本的#define术语的扩散感到困惑:

#define _tmain wmain
Run Code Online (Sandbox Code Playgroud)

当我第一次学习C语言时,我的主要功能是:

int main(int argc, char *argv[])
Run Code Online (Sandbox Code Playgroud)

在我创建的Visual C++项目中,它创建了主要功能:

int _tmain(int argc, _TCHAR* argv[])
Run Code Online (Sandbox Code Playgroud)

我只是想知道为什么要起个名翻译需要wmain_tmain?为什么不使用原始的C main函数原型?

一般来说,似乎有很多#define重命名的东西,看起来很清楚,看起来更神秘,更不清楚(我的意思wmain_tmain?).

感谢您容忍可能是一个非常明显的问题.

Jam*_*lis 13

这是Visual C++特有的功能,它不是C++的一部分.

大多数Windows API函数都有两个版本:结尾的版本W,用于宽字符串(wchar_t字符串)和结尾的版本A,用于窄字符串(char字符串).实际的Windows API"函数"没有任何后缀,并且被定义为根据设置扩展到正确版本的宏.

T名称(如_TCHAR_tmain)是为了同样的目的:他们是扩大到正确的名称取决于您的编译设置宏,所以wchar_twmain宽字符支持,或charmain窄字符的支持.

我们的想法是,如果使用字符类型不可知的名称(T名称)编写代码,则可以编译代码以使用窄字符(ASCII)或宽字符(Unicode)而不更改它.权衡是您的代码不太便携.

  • @Sam:既然你说你是C++编程的新手,我强烈建议你先学习编写可移植的C++,并尽可能学会避免使用语言扩展和特定于平台的功能.尝试只在必要时编写与平台相关的代码(例如,当您必须与操作系统互操作或使用无法通过C++标准库访问的功能时).当您必须使用特定于平台的代码时,请尝试尽可能地隔离它,以便在必要时可以轻松地将代码移植到其他平台. (2认同)

Joh*_*eek 5

因为Microsoft决定向C++添加Unicode支持的最佳方法是添加一个TCHAR类型,它是#defined char或者wchar_t取决于项目属性>配置属性>常规>字符集的值.根据该设置,_tmain也可以#defined main(取chars)或wmainwchar_ts (取s).

  • @Sam:不幸的是,Windows操作系统组是C专家,因此他们使用#define而不是typedef,而使用宏而不是内联函数.这会将数千个令人讨厌的宏引入到Windows标题中,当其中一个宏意外地与您的某个函数名称匹配时,您会注意到这些宏.:-( (2认同)