为什么模板函数加了__stdcall修饰后编译器不认呢?(vc6.0环境)
#include <iostream>
using namespace std;
template<class c>
void __stdcall f(){ cout << "Size = " << sizeof( c ) << endl; }
typedef void ( __stdcall *PF )();
void a(PF f)
{
f();
}
void main()
{
f<int>(); //可以
a(f<int>); //不可以,说f<int>不是__stdcall类型的
//我就奇了怪了,为什么模板函数加了__stdcall修饰后编译器不认呢?如果不是模板函数,是可以的。
}
using namespace std;
template<class c>
void __stdcall f(){ cout << "Size = " << sizeof( c ) << endl; }
typedef void ( __stdcall *PF )();
void a(PF f)
{
f();
}
void main()
{
f<int>(); //可以
a(f<int>); //不可以,说f<int>不是__stdcall类型的
//我就奇了怪了,为什么模板函数加了__stdcall修饰后编译器不认呢?如果不是模板函数,是可以的。
}
...全文
相关推荐
VC6.0编译器介绍.pdf
VC6.0编译器介绍.pdf
函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)
函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal) 关于函数的调用规则(调用约定),大多数时候是不需要了解的,但是如果需要跨语言的编程,比如VC写的dll要delphi调用,则需要了解。 microsoft的vc默认的是__cdecl方式,而windows API则是__stdcall,如果用vc开发dll给其他语言用,则应该指定__stdcall方式。堆栈由谁清除这个很重要,如果是要写汇编函数给C调用,一定要小心堆栈的清除工作,如果是__cdecl方式的函数,则函数本身(如果不用汇编写)则不需要关心保存参数的堆栈的清除,但是如果是__stdcall的规则,一定要在函数退出(ret)前恢复堆栈。
亲密接触VC6.0编译器
亲密接触VC6.0编译器,是初学者和老手不可多得的资料
VC中回调函数(callback)深入解析
通过此文讲解,让希望学好vc的同学真正理解vc中回调函数的结构和意义
__stdcall 和 __cdecl 的区别浅析
__stdcall 和 __cdecl 的区别浅析,需要的朋友可以参考一下


