用extern关键字使程序更加清晰
一、基础研究
之前基于tcc、tlink实现一个新的编译连接工具cc.exe,用到的文件有cs.lib、c0s.obj、main.obj,其中main.obj是我们自己加入的文件,它可以实现开始显示彩色字符串“welcome to c”,等待用户按键后执行程序,现在我们要把它替换为下面的程序编译成的obj文件:

观察程序,发现在定义指针code和函数指针f的时候用到了extern关键字。extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这是一个声明语句,但是在当前程序中没有定义,所以我们要在其他文件中对它们进行定义。
这里main函数的功能为用户输入字符串a和b以及符号ch,判断输入的符号并调用相应函数进行计算。
写一个程序mc.c,用cc编译后运行。
这需要我们把实现“+、-、*、/”的函数和函数指针的定义在mc.c中实现。
编写程序如下:

结果编译出现错误。这说明**f和*f[4]在这里是不一样的,这是为什么呢?
既然不能直接初始化指针f,那么我们就定义一个函数指针数组来存放函数的首地址,再把这个数组的首地址赋给指针f。即指针f存储的是函数数组元素的地址。程序如下:

运行结果和程序a.c编译连接的结果是一样的。
那么应该怎么理解这种开发模式呢?在这里我们的程序里甚至不用写主函数,只需要写子函数以及对一些变量进行初始化,而要执行的主函数、要执行的语句都已经封装在编译工具里,这是比较高度地封装,但是它也有局限性,比如只能实现操作符的扩展,只能对两个数进行计算等。
二、扩展研究
(1)**f和*f[4]在这里是不一样的,这是为什么呢?
答:只有*f和f[]能够随意互相替换,因为它们的数据都是顺序存储的,而数组和指针的一个最大的区别就是数组能够注明数据存储的顺序,比如f[][3]={{1},{2,3},{4,5,6}}在内存中的存储数据是100230456.一维以上的数组和一级以上的指针的存储数据的方式已经是不同的了,所以不能互换了。
三、研究总结
我觉得我现在对封装的理解是它可以使程序更具有针对性,专门用来解决一个问题或者一系列问题。它在一定程度上减少了程序的可扩展性,但是加强了程序的精简度和针对性。也就是说,实现一个功能变得更加简单和快速了,而要丰富一个项目程序,我们要做的是增加它的功能模块而不是加大单个程序。这正是符合电脑组成原理、编程原理、人类社会的运行规律,即有序,分工明确,各部分专精,使单个单位的效率达到最大。
用extern关键字使程序更加清晰的更多相关文章
- 转载 浅谈C/C++中的static和extern关键字
浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...
- 浅谈C/C++中的static和extern关键字 转
原文:http://developer.51cto.com/art/201104/256820.htm static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.extern, &quo ...
- typedef define typedef可以使程序参数化,提高程序的可移植性。
小结: 1. typedef并没有创建一个新类型,它只是为某个已存在的类型增加了一个新的名称而已: 2. typedef声明也没有证据新的语义:通过这种方式声明的变量与通过普通方式声明的变量具有完全相 ...
- C语言extern关键字使用
在chinaunix上看见一篇转载的文章,觉得特别好,关于extern使用的解释: 参考链接:http://doc.chinaunix.net/CPP/201206/2248432.shtml 在C语 ...
- C++之extern关键字
extern关键字 extern extern关键字的作用就是告诉编译器,它修饰的变量或者函数在别处定义. extern "C" 代码一: cppExample.h #ifndef ...
- (转)extern关键字两种场景的使用
第一种场景 -- extern extern关键字的作用是声明变量和函数为外部链接,即该变量或函数名在其它文件中可见.用其声明的变量或函数应该在别的文件或同一文件的其它地方定义. 例如语句:exter ...
- static 和extern关键字
static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话 ...
- 浅谈C/C++中的static和extern关键字
static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话 ...
- extern关键字及C\C++相互调用
extern关键字主要修饰变量或函数,表示该函数可以跨文件访问,或者表明该变量在其他文件定义,在此处引用. 1.extern修饰变量 (1)如果某变量int m在a.c中定义声明,则其他b.c文件访问 ...
随机推荐
- Eclipse导入Gradle时报错:SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable
百度查到http://stackoverflow.com/questions/19794200/gradle-android-and-the-android-home-sdk-location 按照其 ...
- PHPExcel讀取excel數據
require_once 'PHPExcel.php'; $PHPReader = new PHPExcel_Reader_Excel2007(); $filePath = 'wjyl.xlsx'; ...
- 关于 Java Collections API 您不知道的 5 件事--转
第 1 部分 http://www.ibm.com/developerworks/cn/java/j-5things2.html 对于很多 Java 开发人员来说,Java Collections A ...
- iOS中navigationItem的titleView如何居中
开发过程中,发现titleview很难居中,通过各种尝试终于找到了解决方法. 首先清楚你个概念: leftBarButtonItem,导航条中左侧button. rightBarButtonItem, ...
- centos7.2下安装mysql5.7,使用rpm包安装
0.环境 本文操作系统: CentOS 7.2.1511 x86_64 MySQL 版本: 5.7.16 1.卸载系统自带的 mariadb-lib[root@centos-linux ~]# rpm ...
- python学习之-成员信息增删改查
python学习之-成员信息增删改查 主要实现了成员信息的增加,修改,查询,和删除功能,写着玩玩,在写的过程中,遇到的问题,旧新成员信息数据的合并,手机号和邮箱的验证,#!/usr/bin/env p ...
- 开源的Android开发框架-------PowerFramework使用心得(一)总体介绍
PowerFramework是一款几乎囊括了所有Android基础功能的框架应用,这个框架目前是开源的,开发者可以在这个框架的基础上进行二次开发.结合开发者自己的UI设计,可以很快就能开发出具备基础应 ...
- 二、T4模板
上文带大家见识了下T4,这里呢开始介绍T4模板有关的内容.关于T4模板介绍和使用网上一搜一箩筐,想深入研究的可以自行去找些资料,这里只介绍接下来我们需要使用的一些知识,不会面面俱到的讲T4模板所有的知 ...
- 【转】自动布局之autoresizingMask使用详解(Storyboard&Code)
原文:http://www.cocoachina.com/ios/20141216/10652.html 自动布局Autolayoutstoryboard 前言:现在已经不像以前那样只有一个尺寸,现在 ...
- OC语法简写
NSNumber [NSNumber numberWithInt:666] 等价于 @666 [NSNumber numberWithLongLong:666ll] 等价于 @666ll [NSNum ...