一、基础研究

之前基于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关键字使程序更加清晰的更多相关文章

  1. 转载 浅谈C/C++中的static和extern关键字

    浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T   static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...

  2. 浅谈C/C++中的static和extern关键字 转

    原文:http://developer.51cto.com/art/201104/256820.htm static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.extern, &quo ...

  3. typedef define typedef可以使程序参数化,提高程序的可移植性。

    小结: 1. typedef并没有创建一个新类型,它只是为某个已存在的类型增加了一个新的名称而已: 2. typedef声明也没有证据新的语义:通过这种方式声明的变量与通过普通方式声明的变量具有完全相 ...

  4. C语言extern关键字使用

    在chinaunix上看见一篇转载的文章,觉得特别好,关于extern使用的解释: 参考链接:http://doc.chinaunix.net/CPP/201206/2248432.shtml 在C语 ...

  5. C++之extern关键字

    extern关键字 extern extern关键字的作用就是告诉编译器,它修饰的变量或者函数在别处定义. extern "C" 代码一: cppExample.h #ifndef ...

  6. (转)extern关键字两种场景的使用

    第一种场景 -- extern extern关键字的作用是声明变量和函数为外部链接,即该变量或函数名在其它文件中可见.用其声明的变量或函数应该在别的文件或同一文件的其它地方定义. 例如语句:exter ...

  7. static 和extern关键字

    static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话 ...

  8. 浅谈C/C++中的static和extern关键字

    static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.extern "C"是使C++能够调用C写作的库文件的一个手段,如果要对编译器提示使用C的方式来处理函数的话 ...

  9. extern关键字及C\C++相互调用

    extern关键字主要修饰变量或函数,表示该函数可以跨文件访问,或者表明该变量在其他文件定义,在此处引用. 1.extern修饰变量 (1)如果某变量int m在a.c中定义声明,则其他b.c文件访问 ...

随机推荐

  1. Paxos算法 Paxos Made Simple

    Paxos算法 Paxos Made Simple Leslie Lamport 2001.11.1 简介 Paxos算法,纯文本方式描述,非常简单. 1 介绍 为 实现具有容错能力的分布式系统而提出 ...

  2. XPath总结(转)

    XPath简介 XPath是W3C的一个标准.它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计.目前有XPath1.0和XPath2.0两个版本.其中Xpath1.0是199 ...

  3. 【转载】运维小技巧:使用ss命令代替 netstat

    转自:https://www.91ri.org/12470.html ss是Socket Statistics的缩写. 顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类 ...

  4. iframe与父页面中JS执行顺序控制

    同事遇到了一个问题: 父页面中有几个iframe,初衷是父页面的JS通过AJAX获取数据,然后用于初始化iframe页面,可以结果却是有的iframe页面却不能获得数据. [问题根源] 父页面在加载i ...

  5. Spring 基础知识

    Spring架构简单描述 原文:https://www.shiyanlou.com/courses/document/212 Spring 概述 1. Spring 是什么 Spring是一个开源的轻 ...

  6. Mac内建Apache

    打开终端 重启apache:sudo /usr/sbin/apachectl restart 关闭apache:sudo /usr/sbin/apachectl stop 开启apache:sudo ...

  7. 利用Asp.net MVC处理文件的上传下载

    如果你仅仅只有Asp.net Web Forms背景转而学习Asp.net MVC的,我想你的第一个经历或许是那些曾经让你的编程变得愉悦无比的服务端控件都驾鹤西去了.FileUpload就是其中一个, ...

  8. hdu 1180 诡异的楼梯 (bfs)

    诡异的楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Sub ...

  9. android应用的不同版本间兼容性处理

    在Android系统中向下兼容性比较差,但是一个应用APP经过处理还是可以在各个版本间运行的.向下兼容性不好,不同版本的系统其API版本也不同,自然有些接口也不同,新的平台不能使用旧的API,旧的平台 ...

  10. Android开发--WIFI实现

    wifi的基本结构 在Android的官方文档中定义了如下五种状态: WIFI_STATE_DISABLING  WIFI网卡正在关闭  0 WIFI_STATE_DISABLED   WIFI网卡不 ...