您的位置:首页 > 其它

关于调用约定和extern “C”对程序设计的作用

2013-09-01 21:37 176 查看
本文是我在vs2008上的一个实验数据。

 关于调用约定的一个重要作用就是规定(1)参数入栈的顺序(2)函数调用结束,是由调用者还是被调用者来清理栈。

下面的实验室针对:函数调用约定与extern “C”声明对编译器产生全局函数符号名的影响

平台是vs2008。

求解释,希望理解的大哥大姐帮忙解释解释!

使用extern “C”声明

(1)   使用标准的调用约定_stdcall

//冒泡排序
SORT_API_
void _stdcall
buble_sort(void *base,size_tnelem,size_twidth,
                        int (_stdcall*fcmp)(constvoid *,constvoid
*));
//快速排序
SORT_API_
void _stdcall
q_sort(void *base,size_tnelem,size_twidth,recursion_enump,
                        int (_stdcall*fcmp)(constvoid *,constvoid
*));
//直接插入排序
SORT_API_
void _stdcall
i_sort(void *base,size_tnelem,size_twidth,
                        int (_stdcall*fcmp)(constvoid *,constvoid
*));
//折半插入排序
SORT_API_
void _stdcall
bi_sort(void *base,size_tnelem,size_twidth,
                        int (_stdcall*fcmp)(constvoid *,constvoid
*));
//希尔排序
SORT_API_
void  _stdcall
s_sort(void *base,size_tnelem,size_twidth,
                        int (_stdcall*fcmp)(constvoid *,constvoid
*));

 

编译后得到的函数符号表:



(2)   使用调用约定_cdecl,即vs2008对全局函数的默认调用约定

//冒泡排序
SORT_API_
void _stdcall
buble_sort(void *base,size_tnelem,size_twidth,
                        int (_stdcall*fcmp)(constvoid *,constvoid
*));
//快速排序
SORT_API_
void _stdcall
q_sort(void *base,size_tnelem,size_twidth,recursion_enump,
                        int (_stdcall*fcmp)(constvoid *,constvoid
*));
//直接插入排序
SORT_API_
void _stdcall
i_sort(void *base,size_tnelem,size_twidth,
                        int (_stdcall*fcmp)(constvoid *,constvoid
*));
//折半插入排序
SORT_API_
void _stdcall
bi_sort(void *base,size_tnelem,size_twidth,
                        int (_stdcall*fcmp)(constvoid *,constvoid
*));
//希尔排序
SORT_API_
void  _cdecl
s_sort(void *base,size_tnelem,size_twidth,
                        int (_stdcall*fcmp)(constvoid *,constvoid
*));
编译后得到的函数符号表:



不使用extern “C”声明:

(1)   使用标准的调用约定_stdcall

代码同上(1)

编译后得到的函数符号表:



(2)   使用调用约定_cdecl, 即vs2008对全局函数的默认调用约定

代码同上(2)

编译后得到的函数符号表:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息