关于头文件的内容--cdecl

本文讨论了C语言中动态内存分配函数的头文件使用,包括ANSI标准推荐的<stdlib.h>和某些编译器需要的<malloc.h>。在使用这些函数时,需要根据编译器手册选择合适的头文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

其他回答    共 1 条
动态存储分配函数头文件,当对内存区进行操作是,调用相关函数.ANSI标准建议使用stdlib.h头文件,但许多C编译要求用malloc.h,使用时应查阅有关手册. 

 

 

===============================================================================

/*      alloc.h

     memory management functions and variables.

     Copyright (c) Borland International 1987,1988
     All Rights Reserved.
*/
#if __STDC__             ;标准C
#define _Cdecl           ;定义C函数声明
#else                
#define _Cdecl      cdecl  
#endif

#ifndef _STDDEF
#define _STDDEF           ;标准定义
#ifndef _PTRDIFF_T        
#define _PTRDIFF_T         ;指针差
#if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
                    ;根据内存模式定义指针类型
                    ;实模式下IA-32有6种程序内存模式
                    ;分别是巨(__HUGE__) ,大(__LARGE__),中(__MEDIUM__)
                    ;     小(__SMALL__),微(__TINY__) ,压缩(__COMPACT__)
                    ;对于__HUGE__,__LARGE__,__MEDIUM__ 定义长指针32位
                    ;这是因为这3种类型数据可以存放在多个段
typedef long      ptrdiff_t;
#else
typedef int      ptrdiff_t;
                    ;定义成短指针,因为数据存在一个段
#endif
#endif
#ifndef _SIZE_T
#define _SIZE_T           ;定义偏移类型,无符号int
typedef unsigned size_t;
#endif
#endif

#ifndef NULL             ;定义NULL
#if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
#define NULL      0
#else
#define NULL      0L
#endif
#endif

int      _Cdecl brk      (void *addr);
                    ;扩大程序可用数据范围,具体用法不明
                    ;指针addr之前为进程可用范围
                    ;之后为不可用范围(包括指针所指位置)
void      *_Cdecl calloc      (size_t nitems, size_t size);
                    ;分配数组空间,nitems为数组元素个数,size为元素大小
#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
unsigned long _Cdecl coreleft      (void);
#else                 ;计算剩余可分配空间,具体用法不明  
unsigned _Cdecl coreleft      (void);
#endif

void       _Cdecl free      (void *block);
                    ;释放 malloc 分配的内存
void      *_Cdecl malloc      (size_t size);
                    ;分配连续内存空间,以八字节对齐,另多分配4个字节
void      *_Cdecl realloc      (void *block, size_t size);
                    ;重新分配内存
void      *_Cdecl sbrk      (int incr);
                    ;增加进程可用空间,与brk()相对应

#if !__STDC__             ;以上内存分配函数的32位形式
void far * _Cdecl farcalloc      (unsigned long nunits, unsigned long unitsz);
unsigned long _Cdecl farcoreleft(void);
void _Cdecl     farfree      (void far *block);
void far *_Cdecl farmalloc      (unsigned long nbytes);
void far *_Cdecl farrealloc      (void far *oldblock, unsigned long nbytes);
#endif

==============================================================================
问:
我知道头文件由三部分内容组成:

(1)头文件开头处的版权和版本声明。

(2)预处理块。

(3)函数和类结构声明等。

下面是我引用的turboc2.0的头文件。第一部分我已清楚。第二部分和第三部分混在一起了,其中有些部分和标号我不太清楚:

如:

#if __STDC__
#define _Cdecl
#else
#define _Cdecl        cdecl
#endif
这部分是干什么用的?

还有

int        _Cdecl brk        (void *addr);
void        *_Cdecl calloc        (size_t nitems, size_t size);

中的  _Cdecl 和 *_Cdecl是干什么用的?


下面是引用的头文件。

*******第一部分********
/*        alloc.h

        memory management functions and variables.

        Copyright (c) Borland International 1987,1988
        All Rights Reserved.
*/

*******第二部分和第三部分********

#if __STDC__
#define _Cdecl
#else
#define _Cdecl        cdecl
#endif

#ifndef _STDDEF
#define _STDDEF
#ifndef _PTRDIFF_T
#define _PTRDIFF_T
#if        defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
typedef long        ptrdiff_t;
#else
typedef int        ptrdiff_t;
#endif
#endif
#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned size_t;
#endif
#endif

#ifndef NULL
#if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
#define NULL        0
#else
#define NULL        0L
#endif
#endif

int        _Cdecl brk        (void *addr);
void        *_Cdecl calloc        (size_t nitems, size_t size);

#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__)
unsigned long _Cdecl coreleft        (void);
#else
unsigned _Cdecl coreleft        (void);
#endif

void         _Cdecl free        (void *block);
void        *_Cdecl malloc        (size_t size);
void        *_Cdecl realloc        (void *block, size_t size);
void        *_Cdecl sbrk        (int incr);

#if !__STDC__
void far  * _Cdecl farcalloc        (unsigned long nunits, unsigned long unitsz);
unsigned long _Cdecl farcoreleft(void);
void _Cdecl      farfree        (void far *block);
void far  *_Cdecl farmalloc        (unsigned long nbytes);
void far  *_Cdecl farrealloc        (void far *oldblock, unsigned long nbytes);
#endif
答:
关于头文件的内容

告诉编译器后面的函数或变量的名称变换方式。
编译后生成的obj文件中你的变量和函数名称实际上和你输入的
不一样C中要在你的函数前加上个下划线。如果你想知道详细的
情况请提出来我给你解释。
Cdecl 是老的标记,新的是cdecl。
表明后面的名称使用规则,大小写敏感前面加下划线。

borland C++中的完整解释如下。
-----------------------------------------------------------------------------
Declares as C-style

Syntax:
    cdecl <data definition>; ;
    cdecl <function definition>; ;
    _cdecl <data definition>; ;
    _cdecl <function definition>; ;
    __cdecl <data definition>; ;
    __cdecl <function definition>; ;

Declares a variable or a function using a C-style naming convention
(case-sensitive, with a leading underscore appended).

In addition, cdecl declares C-style parameter passing conventions when
applied to a function header (last parameter pushed first, and the caller
cleans up the stack).

  Example:
   int cdecl FileCount;
   far cdecl HisFunc(int x);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值