c语言掩码结构体

来源:互联网 发布:excel2013破解软件 编辑:程序博客网 时间:2024/06/06 10:04

最近实习,在公司里看底层接口代码,发现用c语言实现一个类似于c++的类是有多么困难,然后突击了一下,了解了一个叫掩码结构体的东东,摸索了半天,终于明白它的意思,给大家分享一下心得(博主水平有限,勿喷)

总共3个文件:一个接口函数文件(class.c)一个给用户的(class.h)一个连接前两个文件的(driver.h)

好了直接贴代码:

******************************************class.c********************************************************

#include"Driver.h"


DEF_CLASS
Class_Name_DEF CLASS_NAME_BUF;
COUNTER_DEF COUNTER;
HEAD_DEF HEAD;
struct LIST
{
SCORE_DEF SCORE;
NEXT_DEF NEXT;
}AList;
END_DEF_CLASS(List_t)

List_t* Creat_A_List(Class_Name_DEF Class_Name)
{
CLASS(List_t)* Pstr=(CLASS(List_t)*)malloc(sizeof(List_t));
Pstr->CLASS_NAME_BUF = Class_Name;
Pstr->COUNTER=0;
Pstr->AList.NEXT = NULL;
Pstr->HEAD = (HEAD_DEF)malloc(sizeof(List));
printf("you have create a new list name is %s \n",Pstr->CLASS_NAME_BUF);
return (List_t*)Pstr;
}
void Add_Data_Lit(List_t *PList, SCORE_DEF Score)
{
CLASS(List_t)* Pstr = (CLASS(List_t)*) PList;
if (Pstr->AList.NEXT == NULL)
{
Pstr->AList.SCORE = Score;
Pstr->AList.NEXT = (HEAD_DEF)malloc(sizeof(List));
printf("This is your first add score in your list ,congratulation!\n");
Pstr->COUNTER++;
}
else
{
Pstr->AList.NEXT->SCORE = Score;
Pstr->AList.NEXT->NEXT= (HEAD_DEF)malloc(sizeof(List));
printf("you have add a score in your list!\n");
Pstr->COUNTER++;
}
}
COUNTER_DEF How_Many_Score(List_t *PList)
{
CLASS(List_t)* Pstr = (CLASS(List_t)*) PList;
printf("Now I have Score about %d\n", Pstr->COUNTER);
return Pstr->COUNTER;
}



***************************************class.h***********************************

#ifndef __CLASS_H__
#define __CLASS_H__
#include"Driver.h"
EXTERN_CLASS
Class_Name_DEF CLASS_NAME_BUF;
COUNTER_DEF COUNTER;
HEAD_DEF HEAD;
struct LIST
{
SCORE_DEF SCORE;
NEXT_DEF NEXT;
}AList;
END_EXTERN_CLASS(List_t)


typedef struct CreatList
{
List_t(*Creat_A_List)(Class_Name_DEF Class_Name);
void(*Add_Data_Lit)(List_t *PList, SCORE_DEF Score);
COUNTER_DEF(*How_Many_Score)(List_t *PList);
};


extern List_t* Creat_A_List(Class_Name_DEF Class_Name);
extern void Add_Data_Lit(List_t *PList, SCORE_DEF Score);
extern COUNTER_DEF How_Many_Score(List_t *PList);
#endif // !__CLASS_H__




******************************************driver.h***************************************

#ifndef __DRIVER_H__
#define __DRIVER_H__
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<string.h>
typedef struct LIST List;
typedef char* Class_Name_DEF;
//typedef int BUFFER_SIZE_DEF;
typedef List* HEAD_DEF;
typedef List* NEXT_DEF;
typedef float SCORE_DEF;
typedef int COUNTER_DEF;




#define EXTERN_CLASS typedef struct { char chMask[sizeof(struct{
#define END_EXTERN_CLASS(__NAME) })];}__NAME;
#define DEF_CLASS typedef struct {
#define END_DEF_CLASS(__NAME) }__##__NAME;\
typedef struct {\
char chMask[sizeof(__##__NAME)];\
}__NAME;


#define CLASS(__NAME)  __##__NAME
#endif // DRIVER


代码大概就这些,c语言接口的实现目的和c++ 的类是一个道理,给你该看的东西,不该看的甭想看。

c是怎么实现的呢??

typedef struct CreatList
{
List_t(*Creat_A_List)(Class_Name_DEF Class_Name);
void(*Add_Data_Lit)(List_t *PList, SCORE_DEF Score);
COUNTER_DEF(*How_Many_Score)(List_t *PList);
};

其实提供一个变量,变量内部用函数指针实现,这样就可以给用户提供他们该看的东西了


那至于不该看的东西如何掩盖呢,就是用掩码结构体了


#define EXTERN_CLASS typedef struct { char chMask[sizeof(struct{
#define END_EXTERN_CLASS(__NAME) })];}__NAME;
#define DEF_CLASS typedef struct {
#define END_DEF_CLASS(__NAME) }__##__NAME;\
typedef struct {\
char chMask[sizeof(__##__NAME)];\
}__NAME;


#define CLASS(__NAME)  __##__NAME

可以把这些宏替换进去,这样便于理解,我人比较懒,so..................

他是如何掩盖住一些东西的呢,其实我理解的意思是class.c里面提供的两个结构体一个是用户会用到的变量(这里用a代替),另一个是char类型的缓冲区(b代替),只是这个b大小和a的大小一样,而class.h里面只有一个,那就是b,用户用到的也是b,只是在.c的函数里面强制转换了一下,提醒一下class.h不会调用class.h这是关键。这样用户用到b这个结构体变量的时候就无法查到里面有哪些变量,这些变量只能在初始化时设置,这样用户就不会看到不该看的东西。

本人不擅长简述有可能讲的比较笼统,多多包涵。