C语言 extern学习2 分析

上一篇文章中,通过头文件声明,而调用有一个特别大的漏洞:

为什么编译器可以链接过来呢,因为默认是extern修饰的,这种类似全局作用域的功能使其可以被调用

继续加强学习:

这一次有两对C文件:

        first.c  first.h

        second.c  second.h

first.c 代码:

//多文件测试
#include "head.h"
#include <stdio.h>
void printStr()

{

    printf("Hello world!\n");

}

first.h代码:

void printStr();   //函数定义域:从声明点延伸到源程序文本结束

相应的,second.c 代码:

#include "second.h"
#include <stdio.h>
void main()

{

printStr();

}

second.h代码:(重点)

extern void printStr();   //函数定义域:从声明点延伸到源程序文本结束

分析:

无疑, 在上面的second.h和first.h中,需要我们用extern标志符来修饰printStr函数的声明,这样,printStr函数就可以被导出到连接程序, 也就是实现了无论在first.c文件中调用,还是在second.c文件中调用,连接程序都会很聪明的按照我们的意愿,把他连接到first.c文件中的printStr函数的定义上去, 而不必我们在second.c文件中也要再写一个一样的printStr函数.

但是,问题随之而来:

那么我们如何来区分哪个头文件中的声明在其对应的.c文件中有定义,而哪个又没有呢?这也许不是必须的,因为无论在哪个文件中定义,聪明的连接程序都会义无返顾的帮我们找到,并导出到连接程序, 但我觉得他确实必要的. 因为我们需要知道这个函数的具体内容是什么,有什么功能, 有了新需求后我也许要修改他,我需要在短时间内能找到这个函数的定义, 那么我来介绍一下在C语言中一个人为的规范:

在.h文件中声明的函数,如果在其对应的.c文件中有定义,那么我们在声明这个函数时,不使用extern修饰符, 如果反之,则必须显示使用extern修饰符.

这样,在C语言的.h文件中,我们会看到两种类型的函数声明. 带extern的,还不带extern的, 简单明了,一个是引用外部函数,一个是自己生命并定义的函数.

所以,在first.h 中 不使用extern修饰符(因为对应的.c文件有该子函数printStr的定义)

在second.h 使用extern修饰符

时间: 2024-10-10 05:59:21

C语言 extern学习2 分析的相关文章

C语言 extern学习1

没有头文件时,通过本文件内的函数声明来确定定义域,实现功能: //单文件测试 #include <stdio.h> /* 经测试,C语言环境下子函数默认是void型:所以可省略不写 为严谨起见,加上void */ void printStr(); //函数定义域:从声明点延伸到源程序文本结束 void main() { printStr(); } void printStr() { printf("Hello world!\n"); } 多文件测试: 第一种方案: main

初探swift语言的学习笔记(可选类型?和隐式可选类型!)

可选类型.隐式可选类型 其次swift还引入一个较有趣的初始值设置语法使用"?"操作符及"!"号操作符 如:"var optionalString: String? = "Hello" optionalString == nil var optionalName: String? = "John Appleseed" var greeting = "Hello!" if let name = op

C语言及OC语言初期学习心得

2015-7-22,周三 经过一个星期C语言的学习,对基础知识语法已经有了一定的了解和认识.同时通过这三天对OC语言的学习,更加了解编程语言都是相融相通的.虽然 OC语言的语法和之前接触的C,JAVA有很大的区别,但是在讲师的解析和引导下,还是比较容易接受的. 学习知识的过程不仅仅是对知识的认识,简单的认识是远远不够的.为了今后更好的开发,要对学过的知识加以理解.辨析,通过代码去实现,加深认知. 以下是我在这段时间在学习的心得和总结. 一.数组的四种遍历方法: 根本两种方法 ·1)指针 ·2)数

C语言基础学习笔记

--C语言框架-- 数据  字节byte          字符   char         8  半字half word     短整型        short int    16    字word            整型   int(integer)   32               长整型   long int     32                 单精度   float        32   双字(double word) 双精度  double       64 

语言的学习基础,100个经典的算法

POJ上做做ACM的题 语言的学习基础,100个经典的算法C语言的学习要从基础开始,这里是100个经典的算法-1C语言的学习要从基础开始,这里是100个经典的算法 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔 子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数 为多少? __________________________________________________________________ 程序分析:兔子的规律为数列1,1,2,3,5,8

C语言课程学习的总结

本学期c语言的学习接近尾声,对此颇有感触,感受良多,随着考试的结束,c语言学习也告了一段落. c语言是一门计算机语言,用最原始的方法输入计算机,向我们展示它的神奇.它可以让我们更好的了解计算机,与计算机交流. 同时也是我们往后学习的基础,是重中之重.所以,c语言的学习对我们是很重要的. 在本学期的c语言学习中,遇到了不少的困难,但有些还是可以解决的.对于c语言的学习,虽然不是很会,但是也有自己的看法. 首先,在c语言的学习中,上课前自己要懂得去预习,尤其是一些知识点的概念和用法,还有教材的经典例

SQL Server 之T-SQL语言的学习

SQL Server 之T-SQL语言的学习 举例: 表1:学生表student 学号 姓名 性别 班级 2007001 李晓明 男 土木0701 2007002 王莉 女 信计0701 表2:成绩表score 学号 课程编号 课程名称 成绩 2007001 1949 高等数学 85 2007001 1823 C语言 98 2007002 1950 数据结构 60 1.数据定义语言 数据库语言属于第四类语言,与其他语言不同之处是: 不区分大小写 字符串全部用单引号 不区分字符和字符串 语句之间不

UNIX/Linux下C语言的学习路线

一.工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具. 1.操作系统    在UNIX或Linux系统中学习C很方便,所以在开始您的学习旅程前请先选择一个UNIX或Linux操作系统,目前可供个人免费使用的UNIX或Linux系统有FreeBSD.RedHat Linux.SUSE Linux等,而且在安装包中还提供很多实用的工具,如:gcc, make等. 如果您一直使用Window

初探swift语言的学习笔记十一(performSelector)

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/35842441 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢! 在OC中使用好好的performSelector,但不知为什么在swift有意的被拿掉了.更有甚者连IMP, objc_msgSend也不能用了.虽然想不通为什么,但应该有他的道理.就不纠结了. 大家可能在OC中使用得更多的就是延时处理,及后台处