Chinaunix首页 | 论坛 | 博客
  • 博客访问: 133415
  • 博文数量: 38
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 191
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-16 11:31
个人简介

嵌入式新人

文章分类

全部博文(38)

文章存档

2016年(38)

我的朋友

分类: 嵌入式

2016-07-28 16:17:59

一 代码的知识点

这是一段很经典的代码实例(来自于朱有鹏老师的C语言专题精讲教程),作用是实现两个数字的加/减/乘/除,从中可以学习和体会到如下知识点
1 cal.h中
1.1· #ifndef 、#define 、#endif 的头文件定义形式,作用是避免头文件的重复包含
1.2  使用 typedef 定义新的数据类型,这里定义了一个(类型)名为pFunc的函数指针类型。
1.3  结构体的定义,结构体内部除了int a;和int b;外,还使用了函数指针变量 pFunc pcal;作为结构体成员,之前没有见过。
1.4  在.h文件中进行函数的声明
1.5  对于自编写的.h文件,使用#include “.h”进行包含,“”通知编译器在当前目录中查找.h文件;对于库文件中的.h文件,使用#include <.h>进行包含,<>通知编译器在C语言的库文件目录中查找.h文件
2 cal.c中
2.1  函数的定义,如add、sub、multiply和devide,以及函数名实际是指向函数存储区域首地址的指针,即函数名的值为函数存储区域首地址。函数实体写在被调用之前,可以不需要声明。
2.2  结构体变量的定义,struct cal_t myCal;
2.3  结构体成员的调用和赋值,结构体成员使用结构体变量名.成员名进行调用,myCal.a = 12;myCal.b = 4;myCal.pcal = multiply;
2.4  函数调用中使用传址,ret = calculator(&myCal); 将结构体变量myCal的地址传给函数calculator。
3 framework.c中
3.1 函数的定义使用指针变量作为形参,而且是指向结构体struct cal_t的指针变量,int calculator(const struct cal_t *p)
3.2 使用指针调用结构体成员(cal.c中的myCal.a 、myCal.b和myCal.pcal = multiply;),return p->pcal(p->a, p->b);使用指针调用结构体成员时,需要使用->来调用,格式为指针变量->结构体成员。
4 三个文件整体可以体会到软件架构的分层
4.1 分层的原因是:对于大型复杂程序,一个人无法完成,需要多人合作完成,于是就要需要将程序进行分层,每个层次由不同的人完成,然后再彼此调用组合,协同工作。
4.2 分层写代码的思路是: 每个层次专注各自不同的领域和任务;不同层次间用头文件进行交互。
4.3 分层后,上层(framwork.c)为下层(cal.c)提供服务,上层代码是被下层代码被调用。
4.4 上层注重业务逻辑,与任务最终的目标直接关联,而没有具体干活的函数;下层注重实际干活的函数,注重为上层填充变量,并且将变量传递给上层中的函数(其实就是调用上层提供的接口函数)来完成任务。
4.5 本例中下层代码的核心是结构体变量(struct cal_t myCal),下层代码的逻辑其实很简单:第一步先定义结构体变量;第二步填充结构体变量;第三步调用上层写好的接口函数,把结构体变量传给它既可(ret = calculator(&myCal);)。

二 代码

1 framework.c


#include "cal.h"

int calculator(const struct cal_t *p)     // 计算器函数
{
 return p->pcal(p->a, p->b);
}

2 cal.h

#ifndef __CAL_H__
#define __CAL_H__


typedef int (*pFunc)(int, int);

struct cal_t
{
 int a;
 int b;
 pFunc pcal;
};


int calculator(const struct cal_t *p); 

#endif

3 cal.c

#include "cal.h"
#include


int add(int a, int b)
{
 return a + b;
}

int sub(int a, int b)
{
 return a - b;
}

int multiply(int a, int b)
{
 return a * b;
}

int divide(int a, int b)
{
 return a / b;
}


int main(void)
{
 int ret = 0;
 struct cal_t myCal;
 
 myCal.a = 12;
 myCal.b = 4;
 myCal.pcal = multiply;
 
 ret = calculator(&myCal);
 printf("ret = %d.\n", ret);
 
 return 0;
}

阅读(1289) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~