带有C风格的 CLib库

#include"CLib.h"
#include<iostream>
#include<string>
#include<cassert>
#include<fstream>
using namespace std;
int main() {
    CStash intStash, stringStash;
    int i;
    char* cp;
    ifstream in;
    string line;
    const int bufsize = 80;
    initialize(&intStash, sizeof(int));
    for ( i = 0; i < 100; i++)
    {
        add(&intStash, &i);
    }
    for (i = 0; i < count(&intStash); i++)
    {
        cout << "fetch(&intStash," << i << ") = "
            << *(int*)fetch(&intStash, i)
            << endl;
    }
    cleanup(&intStash);
    system("pause");
    
}
#ifndef CLIB_H
#define CLIB_H

typedef struct CStashTag {
    int size;
    int quantity;
    int next;
    unsigned char* storage;
}CStash;

void initialize(CStash* s, int size);
void cleanup(CStash *s);
int add(CStash *s, const void* element);
void* fetch(CStash*s, int index); //
int count(CStash* s);
void inflate(CStash* s, int increate);//增加

#endif // !CLIB_H
#include "CLib.h"
#include<iostream>
#include<cassert>
using namespace std;
const int increment = 100;

void initialize(CStash * s, int size)
{
    s->size = size;
    s->quantity = 0;
    s->storage = 0;
    s->next = 0;
}

void cleanup(CStash * s)
{
    if (s->storage != 0)
        cout << "free" << endl;
    delete[] s->storage;
}

int add(CStash * s, const void * element)
{
    if(s->next>=s->quantity)
        inflate(s,increment );
    int startBytes = s->next* s->size;
    unsigned char *e = (unsigned char *)element;
    for (int i = 0; i < s->size; i++)
        s->storage[startBytes + i] = e[i];
    s->next++;
    
    return (s->next - 1);
}

void * fetch(CStash * s, int index)
{
    assert(0 <= index);
    if (index >= s->next)
        return 0;
    return &(s->storage[index*s->size]);
}

int count(CStash * s)
{
    return s->next;
}

void inflate(CStash * s, int increate)
{
    assert(increate > 0);
    int newQuantity = s->quantity + increment;
    int newBytes = newQuantity * s->size;
    int oldBytes = s->quantity*s->size;
    unsigned char *b = new unsigned char[newBytes];
    for (int i = 0; i < oldBytes; i++)
    {
        b[i] = s->storage[i];
    }
    delete[](s->storage);
    s->storage = b;
    s->quantity = newQuantity;

}

 

class Stash {
    struct Link {
        void *data;
        Link* next;
        void init(void* dat, Link* nxt);
    }*head;
public:
    void init();
    void push(void *dat, Link* nxt);
    void *peek();
    void* pop();
    void cleanup();
};

 

转载于:https://www.cnblogs.com/jingchu/p/10062062.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
部分内容:  用C 语言编程时,通常要建立一些用户函数。如果这些函数具有通用性,一般的方法是将它们作成头文件,当需要时用“#include”命令将其包含到源程序之中,以提高编程效率。但在特定的程序中一般仅使用这些函数的一部分,若用上述方法包含所有函数,编译器在编译的时候会把所有包含进的函数都进行编译,这无疑会使源程序变得庞大而难于理解,并会影响执行效率。建立用户目标模块lib文件)可以解决这个问题,你可以事先把有特定功能的通用的子函数集编译完成后生成的obj文件打入lib文件,当链接器tlink.exe在进行链接操作时,便只会把程序内部用到的通用函数所在的obj文件链接进来(已验证:不能定位到具体函数),这样生成的obj文件便会更精简,生成的exe文件也更小。   其实,一个lib文件是obj文件的集合。当然,其中还夹杂着其他一些辅助信息,目的是为了让编译器能够准确找到对应的obj文件。我们可以通过tlib.exe(在tc2.0下的根目录)来对lib文件进行操作,你可以把自己生成的obj文件通过tlib命令加入到一个lib文件中,也可以把lib文件内的obj文件进行删除操作,还可以把内部的obj文件给提取出来。明白了lib文件的大致结构以及对它的具体操作,在学习C语言的过程中,就会又多了一个切入点对C语言具体实现进行研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值