关于int APIENTRY _tWinMain中APIENTRY及相关返回类型的疑问
解答:
int APIENTRY _tWinMain里的APIENTRY和“第二个返回类型”疑问 刚上手Win32 GUI编程的时候,碰到这种和平时写的常规C++函数不一样的声明确实容易懵,我来给你掰碎了讲清楚:
1. APIENTRY的含义
APIENTRY其实是个调用约定宏,在Windows系统头文件里它被定义为__stdcall。调用约定说白了就是一套底层规则,规定了函数调用时参数的传递顺序、栈的清理责任(是调用者还是被调用者来清理栈)、函数名的修饰格式这些细节。
Win32的大部分核心API都遵循__stdcall这个约定,微软定义APIENTRY宏就是为了统一这个规则——不管你用MSVC还是GCC编译器,只要用这个宏,编译器就知道该按Win32的标准来处理这个函数,避免因为调用约定不匹配导致程序崩溃或者栈溢出的问题。
2. 你提到的“第二个返回类型”其实是误解
你可能把APIENTRY当成第二个返回类型了,但它真不是!它是刚才说的调用约定修饰符,夹在返回类型int和函数名_tWinMain中间,用来告诉编译器这个函数要遵循的调用规则。
给你看完整的_tWinMain标准原型就一目了然了:
int APIENTRY _tWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow );
这里只有最开头的int是返回类型,APIENTRY是调用约定,后面的_tWinMain是函数名,括号里的是参数列表,根本不存在第二个返回类型哦。
顺便提一句,_tWinMain是个Unicode兼容宏:如果你的项目定义了UNICODE宏,它就会被替换成wWinMain(宽字符版本);没定义的话就替换为WinMain(ANSI版本),这是Win32里用来兼容不同字符集的常见操作。
内容的提问来源于stack exchange,提问作者amal jith
相关产品推荐
相关产品推荐

