walnutcy

C语言的结构体应用:结构体实现类

0
阅读(3170)

之前面试,也常问一个问题: struct 与class有何异同?得到的回答是千奇百怪,大多都认struct只能用来定义数据结构体,而class可以有方法等。其实struct 很强大,喜欢看开源工程的都知道,老外写C软件时就用struct来做分层控制,来将设备的不同归成一种相同的对象接口。

其实二者仅有的差别就是:struct的所有成员都是public的。

这里就先讲一下struct用来实现函数的,这里举的例子是一个C语言简化库函数的实现,具体实现可以参考后边附的代码。这里主要利用了两个特点:1) 函数指针; 2) 变量包含,用来定义版本及编译日期。

基于后边例程的参考,我们就可以将之使用推广到其他应用,如汽车音响中的收音机模块,写一个结构体并实现即可,下次换收音机模块时,重新实现下个别函数即可。

经常看到老HOT到处宣传他的C++嵌入式,其实个人觉得他已陷入对一种语言的痴迷,算是技术迷吧。就软件设计的角度来讲,嵌入式软件中也可以实现分层划分,并用C语言进行类化实现的。

附一个简单的struct应用:

typedef struct
{
    const u32 version;
 const char* sVersion;
    /*---memory------*/
    void*   (*memset)   (void *s, u8 c, u16 n);
    void*   (*memcpy)   (void* dest, const void* source, u16 count);
    void*   (*memmove)  (void* dest, const void* source, u16 count);
    u8      (*memcmp)   (const void *s1, const void *s2, u16 NumBytes);
     /*---type  ------*/
    u8      (*isdigit)  (u8 ch);
    u8      (*isxdigit) (u8 ch);
    u8      (*isalpha)  (u8 ch);
    u8      (*islower)  (u8 ch);
    u8      (*isupper)  (u8 ch);
    u8      (*digitValue)   (u8 ch);
    char    (*digittochar)  (u8 digit);
    char    (*toupper)      (char c);
    char    (*tolower)      (char c);
    /*---string------*/
    char*   (*strcpy)  (char *s1, const char* s2);
    char*   (*strncpy) (char *s1, const char* s2, u16 n);
    u16     (*strlen)  (const char* s);
    u8      (*strcmp)  (const char* s1, const char* s2);
    u8      (*strncmp) (const char* s1, const char* s2, u16 n);
    char*   (*str2upper)    (char* s);
    char*   (*str2lower)    (char* s);
    char*   (*strchr)       (char* str, char chr);
    char*   (*strrchr)      (char* str, char chr);
    char*   (*strstr)       (char* str1, const char* str2);

#if USE_PRINTF_LIB_100311   
    u16     (*rand)         (u32 seed);
    /*---printf------*/
    int     (*vprintf)      (const char* format, va_list args, APPLIB_PRINT_ST* desc);
    int     (*vsprintf)     (char* s, const char* format, va_list args);
    int     (*sprintf)      (char* s, const char* format, ...);
#endif
}APP_SERVICE_ST;

const APP_SERVICE_ST  bioslib =
{
    0xA1F01F03, /*Version: A1.01.02 */
 __DATE__ __TIME__,
    /*---memory------*/
……

……

};