一、基础研究

之前基于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. 424. Longest Repeating Character Replacement

    以最左边为开始,往右遍历,不一样的个数大于K的时候停止,回到第一个不一样的地方,以它为开始,继续.. 用QUEUE记录每次不一样的INDEX,以便下一个遍历开始, 从左往右,从右往左各来一次..加上各 ...

  2. Java 二分查找

    public int binarySearch(int[] nums, int target) { int low = 0; int high = nums.length; while (low &l ...

  3. java 从零开始,学习笔记之基础入门<Oracle_基础>(三十三)

    Oracle 数据库基本知识   [训练1] 显示DEPT表的指定字段的查询.               输入并执行查询:               SELECTdeptno,dname FROM ...

  4. 模板-->求逆矩阵(利用初等变换求解)

    如果有相应的OJ题目,欢迎同学们提供相应的链接 相关链接 所有模板的快速链接 简单的测试 INPUT: 3 2 1 0 1 2 1 1 1 1 OUTPUT: 0.5 -0.5 0.5 0 1 -1 ...

  5. codevs 1994 排队 排列组合+高精度

    /* 数学题0.0 最后答案:A(n,n)*A(n+1,2)*A(n+3,m)+A(n,n)*C(m,1)*A(2,2)*C(n+1,1)*A(n+2,m-1); 简单解释一下 +之前的很显然 先排男 ...

  6. DOM Style样式对象的详细用法

    DOM Style样式对象的详细用法 HTML Style样式比较复杂,相应访问.修改方法也有所差异.参考相关资料,整理如下. 典型Html文件如下,有三种定义方式. <head>     ...

  7. Tab页签切换

    js之tab页签切换效果       现在web网站,很多地都需要用到tab页签. 示例:         $(document).ready(function(){               va ...

  8. easydialog.js

    /** * easyDialog v2.2 * Url : http://stylechen.com/easydialog-v2.0.html * Author : chenmnkken@gmail. ...

  9. ASP.NET性能优化小结

    一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的 ...

  10. SQL 查询的执行过程

    所述内容均来自互联网,文章仅作为学习笔记,备忘使用. 有时候我在想我们总是在谈优化,FA 优化结构.优化框架.优化程序…,可是我真的了解将要进行的操作[优化]吗?以最近我的工作-优化SQL为例,我真的 ...