用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文件访问 ...
随机推荐
- springMVC整合jedis+redis
http://www.cnblogs.com/zhengbn/p/4140549.html 前两天写过 springMVC+memcached 的整合,我从这个基础上改造一下,把redis和sprin ...
- JQuery中_Radio、DropDownList、Checkbox选择控件的处理
Radio 1.获取选中值,三种方法都可以: $('input:radio:checked').val(): $("input[type='radio']:checked").v ...
- Android Dialog触摸对话框外部让其消失的实现方法
方法一: @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent ...
- ORACLE 11G EXP导出空表方法
EXP在导出11G的库的时候,与过去10G,9I的版本有很大的差别. 就是没有数据的表是不会分配空间的. 从Oracle 11.2.0.1版本开始,Oracle又提供了一种新的空间分配方法: Crea ...
- 几句话实现导航栏透明渐变 – iOS
首先我们来看下效果 一开始当我们什么只设置了一张图片作为它的头部视图的时候,它是这样的 首当其冲的,我们先得把导航栏弄透明 那么我们首先得知道,设置navigationBar的BackgroundCo ...
- 案例:我行我素购物系统 v1.1
系统逻辑结构: import java.util.Scanner; public class ShoppingSystem { public static void main(String[] arg ...
- Android(java)学习笔记238:多媒体之图片画画板案例
1.首先我们编写布局文件activity_main.xml如下: <RelativeLayout xmlns:android="http://schemas.android.com/a ...
- .net(全局文件,错误页,静态页,IIS配置及防黑)
添加全局应用程序类. <%@ Application Language="C#" %> <script runat="server"> ...
- Android 中Webview 自适应屏幕
随笔 - 478 文章 - 3 评论 - 113 Android 中Webview 自适应屏幕 webview中右下角的缩放按钮能不能去掉 settings.setDisplayZoomCon ...
- Oracle中的over(partition by...)分析函数及开窗函数
假设有一张表student Name Score InsertTime (Name:姓名 Score:成绩 InsertTime:考试时间) 张三 20 2015-08-08 ...