好久没写了,今天出差,晚上没什么事,提笔想了想,就写写如何用好C语言的结构体这个关键字吧。
之前面试,也常问一个问题: 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------*/
……
……
};
文章评论(0条评论)
登录后参与讨论