阅读了上一篇分享的文章,我个人认为,最重要的结论如下:

总结:

对变量而言,如果你想在本源文件(例如文件名A)中使用另一个源文件(例如文件名B)的变量,方法有2种:(1)在A文件中必须用extern声明在B文件中定义的变量(当然是全局变量);(2)在A文件中添加B文件对应的头文件,当然这个头文件包含B文件中的变量声明,也即在这个头文件中必须用extern声明该变量,否则,该变量又被定义一次。

对函数而言,如果你想在本源文件(例如文件名A)中使用另一个源文件(例如文件名B)的函数,方法有2种:(1)在A文件中用extern声明在B文件中定义的函数(其实,也可省略extern,只需在A文件中出现B文件定义函数原型即可);(2)在A文件中添加B文件对应的头文件,当然这个头文件包含B文件中的函数原型,在头文件中函数可以不用加extern。

/***********************************************************************/

上面的总结换成另外一种说法是:

(a)对于一个文件A.c中调用另一个文件B.c的全局变量,

1. 因为全局变量一般定义在原文件B.c中,我们不能用#include包含源文件而只能包含头文件,所以常用的方法是:在文件A.c中用extern  int a; 来声明外部变量;

2. 另外一种方法是可以是在B.c文件中定义了全局变量int global_num ,可以在对应的B.h头文件中写extern int global_num ,这样其他源文件(包含A.c文件)可以通过“include B.h”来声明它是外部变量就可以了。

(b)对于一个文件A.c 中调用另一个文件B.c 的全局函数,

1. 在文件A.c 中用extern int func_name() 来声明对B.c 中函数的引用;

2. 另外一种方法是,在B.h 头文件中写入 "extern int func_name();",或者是"int func_name() "(加不加extern都可以),这样其他源文件可以通过 “include B.h”来包含对外部函数的声明就可以了。

下面还有变量和函数的不同举例:

int a;   是定义

int a = 0;是定义

extern int a = 0;是定义

extern int a; 是声明

而函数

int fun(); 和 extern int fun(); 都是声明(定义要有实现体)。  用extern int  fun()只是更明确指明是声明而已。

/************************************************************************************************************************************************/

上面是对原文的总结。下面是作者认为较好的代码编写习惯。

/************************************************************************************************************************************************/

作者认为:

A.c    B.c     B.h 中最好的做法是:(A.c中要引用对B.c 文件中的变量和函数。)

变量:

B.c 定义变量 int global_name = 0;

B.h 声明变量 extern int global_name;

A.c 中,(1)extern int global_name; (2)#Include “B.h”

函数:

B.c 定义函数 int global_func_name(){ .... ....... }

B.h 声明函数 extern intglobal_func_name(); 或者 int global_func_name(); (加不加extern都表示对函数的声明。)

A.c 中,(1)extern int global_func_name(); (2)#Include “B.h”

/************************************************************************************************************************************************/

这样的话:在引用的文件中A.c中,就可以用extern 或是 include ,都可以了。不知是不是好习惯,希望大家指正。学习中........

/************************************************************************************************************************************************/

按照上面的习惯,可以避免上一篇文章提到的”若是在B.h中定义了一个全局变量”int global_name=0; “,多个源文件”#includeB.h“后,多个c文件编译时是不会出错的,但在链接时就会报错,说你多处定义了同一个变量,“的问题。

对上一篇文章《extern与头文件(*.h)的区别和联系》的学习体会相关推荐

  1. extern与头文件(*.h)的区别和联系

    原文网址为:http://lpy999.blog.163.com/blog/static/117372061201182051413310/ 个人认为有一些道理:所以转过来学习了. 用#include ...

  2. C语言头文件.h互相包含所引发的一系列错误C2143之类的解决方法

    本文可解决的问题: 在一个头文件.h中定义一个结构体,在另一个.h文件中使用这个结构体引发错误 C2143    语法错误: 缺少")"(在"*"的前面) (编 ...

  3. 单片机零基础入门(9-1)实战:模块化编程(模块化两个案例含源码--以及无法显示头文件(.h)的解决方案)

    单片机零基础入门(9-1)实战:模块化编程-(以及无法显示头文件(.h)的解决方案) 本文作为单片机零基础入门(8-5)模块化编程的拓展和补充,比前面的单片机零基础入门(8-5)模块化编程更为详细. ...

  4. 一篇文章告诉你标准化和归一化的区别?

    一篇文章告诉你标准化和归一化的区别? 2019-02-28 17:12:39 融融网融融网阅读量:484 进一步推进企业的标准化工作,使之发展水平适应经济全球化下市场竞争的要求,促进企业综合实力的提升 ...

  5. linux里c库和gnu c库,Linux下的C的库文件和头文件有什么区别-

    Linux下的C的库文件和头文件有什么区别- (2012-04-10 01:16:57) 标签: linux 杂谈 Linux下的C的库文件和头文件有什么区别?刚刚接触 这里有点没搞清楚 如果按我的理 ...

  6. 小说一下sizeof和strlen头文件的的区别

    小说一下sizeof和strlen头文件的的区别 之前的博客对sizeof和strlen没有怎么区分,看了一些其他,现在就来补充一下 strlen 是一个函数,它用来计算指定字符串的长度,但不包括结束 ...

  7. 个人学习之C++ 头文件.h与.cpp

    最近在学习的过程中发现这个问题,因为是学习所以内容对网上的内容有很多参考 在一个C++程序中,只包含两类文件--.cpp文件和.h文件. 一.初步了解 1.头文件的作用:  方便函数的统一的声明 2. ...

  8. c++ 头文件 .h 理解与实践

    头文件如何来关联源文件? 这个问题实际上是说,已知头文件"a.h"声明了一系列函数(仅有函数原型,没有函数实现),"b.cpp"中实现了这些函数,那么如果我想在 ...

  9. mp4文件时长 c++源码_【C语言】如何使用头文件 .h 编译 C 源码!so easy!

    在 C 语言中,头文件或包含文件通常是一个源代码文件,程序员使用编译器指令将头文件包含进其他源文件的开始(或头部),由编译器在处理另一个源文件时自动包含进来. 一个头文件一般包含类.子程序.变量和其他 ...

最新文章

  1. javascript es6 module 模块 的使用
  2. 3. Port scanners (端口扫描器 4个)
  3. 期货与期权(part9)--交易员类型和交易指令类型
  4. cpu开核_新锐龙让AMD重返巅峰,但逆袭的50年里这些CPU也不应忘记
  5. STL 源代码剖析 算法 stl_algo.h -- search
  6. windows2003路由和远程访问 试图连接到数据存储时出错
  7. 使用BIND安装智能DNS服务器(三)---添加view和acl配置
  8. 快速切换Mac系统设置One Switch
  9. eclipse ADT
  10. 用Python下载风云四号高清卫星云图
  11. [AngularJS面面观] 16. 依赖注入 --- 注入器中如何管理对象
  12. 日语简体形与敬体形 - 新版标日22课
  13. word转换成pdf后图片压缩失真的解决方法
  14. 电大本科计算机科学与技术,中央电大开放本科计算机科学与技术专业微计算机技术试题_0701...
  15. 网络游戏专业术语中英文对照版
  16. MySQL之存储过程及函数的使用
  17. Multisim3.8应用实例
  18. pythonGUI(二)基本元素之二
  19. HTML+JS实现省市区三级联动亲测可用
  20. 案例实战:用户评论情感分析模型

热门文章

  1. 魔乐科技安卓开发教程----李兴华----19 传感器
  2. win10家庭中文版安装iis服务
  3. 中国台湾内存制造商威刚遭勒索攻击
  4. docker搭建grafana+loki+promtail日志收集系统
  5. 硬盘的扇面、磁道、扇区
  6. 记录一次详细在线加密PDF解密过程
  7. vsc code-runner插件运行python文件,解释器更改为ananconda
  8. 如何DIY一个还原三阶魔方的机器人
  9. 《炬丰科技-半导体工艺》--技术资料合集26
  10. 交互设计是什么:一篇文章推开交互设计的大门