对上一篇文章《extern与头文件(*.h)的区别和联系》的学习体会
2012-02-09 15:02
323 查看
阅读了上一篇分享的文章,我个人认为,最重要的结论如下:
总结:
对变量而言,如果你想在本源文件(例如文件名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文件编译时是不会出错的,但在链接时就会报错,说你多处定义了同一个变量,“的问题。
总结:
对变量而言,如果你想在本源文件(例如文件名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)的区别和联系 和学习体会
- 一篇文章讲清楚人工智能、机器学习和深度学习的区别与联系
- 一篇文章讲清楚人工智能、机器学习和深度学习的区别与联系
- 一篇文章讲清楚人工智能、机器学习和深度学习的区别与联系
- python里面的全局变量和局部变量的区别(很好的一篇文章,找不到出处,原作者看到请联系,我会署上名字)
- 一篇文章讲清楚人工智能、机器学习和深度学习的区别与联系
- 一篇文章讲清楚人工智能、机器学习和深度学习的区别和联系
- 黑马程序员java基础学习日记——做题遇到GBK查资料发现了个有趣的文章——ASCII、Unicode、GBK和UTF-8字符编码的区别联系
- 黑马程序员—2—Java基础:循环体的区别于联系和学习心得体会
- [转载]一篇十分优秀的学习隐马尔可夫模型的文章(良心啊)
- 今天看到一篇介绍环形消息队列的文章,学习了
- Android:学习AIDL,这一篇文章就够了
- 学习体会:SAP Data Services和SAP Replication Server的区别
- Swift学习之和Objective-C的联系与区别
- 开一篇文章 记录我的java学习路上看过的书和资料 以及杂七杂八的面试经历
- JMS学习(五)--ActiveMQ中的消息的持久化和非持久化 以及 持久订阅者 和 非持久订阅者之间的区别与联系
- TensorFlow深度学习,一篇文章就够了
- 学习笔记:The Log(我所读过的最好的一篇分布式技术文章)
- 这实在是一篇少走许多学习弯路的好文章