关于调用约定和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)
编译后得到的函数符号表:
关于调用约定的一个重要作用就是规定(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)
编译后得到的函数符号表:
相关文章推荐
- C/C++ 函数的编译方式与调用约定以及extern “C”的使用
- 关于函数调用约定-thiscall调用约定
- 关于被中断的系统调用,看SA_RESTART标志的作用
- 关于函数指针的调用约定修饰
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
- 关于调用约定(cdecl、fastcall、、thiscall) 的一点知识(用汇编来解释)good
- 关于调用约定(cdecl、fastcall、fastcall、thiscall) 的一点知识
- C++编译时函数名修饰约定规则(很具体),MFC提供的宏,extern "C"的作用
- 关于调用约定
- 关于全局变量和函数,在其他类中调用问题,extern关键字
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
- 关于函数的调用约定
- windows程序设计之调用动态链接库DLL DLL的调用约定 GlobalMemoryStatusEx
- 关于调用约定(cdecl、fastcall、stcall、thiscall) 的一点知识
- Windows程序设计笔记-------调用约定
- 关于调用约定
- 关于函数参数入栈的思考(函数调用约定,入栈顺序)
- 关于调用约定(cdecl、fastcall、thiscall)
- 关于调用约定(cdecl、fastcall、、thiscall) 的一点知识