http://www.phpvar.com/archives/2595.html
回调函数前面为什么要加CALLBACK,__stdcall?
https://bbs.youkuaiyun.com/topics/391905275?page=1
以下是几个回答。
1.第一是限制调用约定是 __stdcall ,C++ 默认是__cdecl的调用约定,他们有什么不同网上大把文章讲,楼主可以看下
第二是为了增加可读性,强调这个函数是一个WINDOWS API函数
同理有时在前面加上CALLBACK也是表示 __stdcall ,同时强调是一个回调函数
2.和回调函数本身无关,如果整个程序都是你自己写的,且不需要导出函数(或库)给别人使用,那么就不需要特意注明调用约定。
__stdcall/ __cdecl等调用约定是规定参数的入栈方式和由谁来清理调用栈(caller还是callee),不同的调用约定之间并没有什么优劣之分,所以你无法确定其他人在某个库的具体实现时用的是那种方式,但是如果你没有依照对方的约定方式去调用对方的函数,就会出现无法预知的后果。
这就好比行车上路,有些地域规定“左行”、有些地域规定“右行”,哪种规定都不影响行车,但你进入到了特定地域,就需要遵照当地的规则,否则就撞车了。
加上__stdcall/ __cdecl 等调用约定,就是明确告诉编译器使用那种调用方式才能正确处理。
3.已经说了,两个作用,强调只是第二个,C/C++ 默认是__cdecl的调用约定,而加上WINAPI就变成了__stdcall调用约定
4.导出函数的话,其他语言脚本基本上都会支持__stdcall的,但C语言默认的cdecl不一定都支持。
所以说,为了兼容性,要加上__stdcall
你可以看看win32的API基本上都是带WINAPI的