qsort() 之 __cdecl

qsort( particles, n, sizeof( particle ), &cmp );这一行一直没能编译通过,报的错误是:

error c2664: “qsort” : 不能将参数 4 从“int (const fileinfo *,const fileinfo *)”转换为“int (__cdecl *)(const void *,const void *)”还好能从网上找到答案,按照下面的格式定义cmp就可以在c++中运行了:int __cdecl cmp(const void* p1, const void* p2 ),还有说法是将cmp定义成static类型也是可以的,我没试。在qsort()中参数4写成cmp或者&cmp都能正常运行,这是咋回事。

    总结一下:

      __cdecl 是c declaration的缩写(declaration,声明),表示c语言默认的函数调用方法:所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数不需要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。

      _stdcall 是standardcall的缩写,是c++的标准调用方式:所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。这些堆栈中的参数由被调用的函数在返回后清除,使用的指令是 retnx,x表示参数占用的字节数,cpu在ret之后自动弹出x个字节的堆栈空间。称为自动清栈。函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能多,不能少,否则返回后会出错。

几种调用约定的区别
__cdecl __fastcall与 __stdcall,三者都是调用约定(calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。 1、__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈, 2、_cdecl是c和c++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。 3、__fastcall调用约定:它是通过寄存器来传送参数的(实际上,它用ecx和edx传送前两个双字(dword)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。 4、thiscall仅仅应用于"c++"成员函数。this指针存放于cx寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。 5、nakedcall采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存esi,edi,ebx,ebp寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。naked call不是类型修饰符,故必须和_declspec共同使用

时间: 2024-09-21 05:45:12

qsort() 之 __cdecl的相关文章

qsort

使用qsort()排序并用 bsearch()搜索是一个比较常用的组合,使用方便快捷. qsort 的函数原型是void __cdecl qsort (void *base,size_tnum,size_t width,int (__cdecl *comp)(const void *,const void*)) 其中base是排序的一个集合数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比较函数. 比如:对一个长为1000的数组进行排序时,int a[1000]; 那

STL中qsort的七种用法

qsort()  应该就是用的快排.貌似是以数据块的方式移动数据,速度较快. 原型:_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*)); 解释:    qsort ( 数组名 ,元素个数,元素占用的空间(sizeof),比较函数) 比较函数是一个自己写的函数  遵循 int com(const void *a,const void *b) 的格式.当a b关系为 >  <  =

C中qsort快速排序使用实例_C 语言

简单的介绍如下. 复制代码 代码如下: /************************************************************************qsort原型:void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );base:数组首地址 num: 数组元素个数width: 每个数组元

qsort函数、sort函数 (精心整理篇)

先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值的数组来说,基本快速排序的效率较低,且不稳定).集成在C语言库函数里面的的qsort函数,使用 三 路划分的方法解决排序这个问题.所谓三路划分,是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分.   具体介绍:-^^ void qsort( void *base, size_t

详解qsort函数的用法

qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针 用于确定排序的顺序 排序方法有很多种, 选择排序,冒泡排序,归并排序,快速排序等. 看名字都知道快速排序 是目前公认的一种比较好的排序算法(我没听书速度比这快的了,特殊

七种qsort排序方法

七种qsort排序方法 <本文中排序都是采用的从小到大排序> 一.对int类型数组排序 C/C++ code int num[100]; Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp); 二.对char类型数组排序(同int类型) C/C++ code char word[100]; Sample: int

无法解析的外部符号 &quot;public: static void __cdecl std::_String_base::_Xran(void)&quot; (?_Xran@_String_base@std@@SAXXZ)&quot;

采用下面的方法.重新编译了一下依赖的库,OK了.   问题描述:       今天用VS2010编译一个在VS2008下Coding的工程的时候,VS给出了一堆链接错误信息,如下图所示:               在ErrorList里面列出了34个链接错误信息,但仔细看的话,其实很多都是重复的,只有两三个外部符号未正确解析,如下:       "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_

qsort实现排序算法

#include <stdio.h> #include <stdlib.h> #define MAX_SQUARE_COUNT 10 typedef struct tagSquare { int no; //编号 int length; //长 int width; //宽 }Square; // 1.按照编号从小到大排序 // 2.对于编号相等的长方形,按照长方形的长排序: // 3.如果编号和长都相同,按照长方形的宽排序: // 4.如果编号.长.宽都相同,就只保留一个长方形用

C语言中qsort函数的应用

qsort函数包含在<stdlib.h>的头文件里,本文中排序都是采用的从小到大排序 一.对int类型数组排序  int num[100]; int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp); 二.对char类型数组排序(同int类型)  char word[100]; int cmp( const void *a , con