用C语言编写程序的时候,我们经常会遇到这样一种情况:希望在头文件中定义一个全局变量,然后包含到两个不同的c文件中,希望这个全局变量能在两个文件中共用

举例说明:项目文件夹project下有main.c、common.c和common.h三个文件,其中common.h文件分别#include在main.c和common.c文件中。现在希望声明一个字符型变量key,在main.c和common.c中公用。

  有人想,既然是想两个文件都用,那就在common.h中声明一个unsigned char key,然后由于包含关系,在main.c和common.c中都是可见的,所以就能共用了。

想起来确实有道理,但是实际写出来,我们发现编译的时候编译器提示出错,一般提示大概都类似于:Error: L6200E: Symbol key multiply defined (by common.o and main.o).也就是说编译器认为我们重复定义了key这个变量。这是因为#include命令就是原封不同的把头文件中的内容搬到#include的位置,所以相当于main.c和common.c中都执行了一次unsigned char key,而C语言中全局变量是项目内(或者叫工程内)可见的,这样就造成了一个项目中两个变量key,编译器就认为是重复定义。

正确的解决办法:使用extern关键字来声明变量为外部变量。具体说就是在其中一个c文件中定义一个全局变量key,然后在另一个要使用key这个变量的c文件中使用extern关键字声明一次,说明这个变量为外部变量,是在其他的c文件中定义的全局变量。请注意我这里的用词:定义和声明。例如在main.c文件中定义变量key,在common.c文件中声明key变量为外部变量,这样这两个文件中就能共享这个变量key了。

(1)main.c文件

#include "common.h"

unsigned char key;

(2)common.c文件:

#include "common.h"

extern unsigned char key;

其实就是变量定义变量声明的区别,变量定义使用“数据类型+变量名称”的形式,编译器需要给他分配内存单元的;而变量声明使用“extern 变量类型+变量名称”的形式,是告诉编译器我这个变量将在其他外部c文件中定义,我这里只是在外部用它。编译器就不给他分配内存空间,而等到真正遇到变量定义的时候再给他分配内存空间。

1、普通变量定义成全局变量

如果是普通类型,完全可以不用*.h文件,直接在*.c文件中定义,在调用文件处用extern 声明,因为对于普通类型,编译器是可以识别的。比如在一个 my.c文件中,我定义了char name[10];那么在别的文件中只要用extern char name[](由于是声明,一位数组可以省略大小,但不建议用指针,比较指针和数组是两回事)外部声明就可以了,告诉编译器这个变量我已经定义过了,具体怎样,你慢慢找吧。这符合常理,因为char是编译器能自主识别的类型。

2、自定义结构体类型定义成全局变量

不同于普通类型,如果不预先通知编译器,编译器是不会识别你自定义的类型的。这个时候,*.h文件便出现了。不是定义结构类型不占内存吗?那好,我大结构体的定义放在*.h文件中,这样一来,无论你incude无数次,内存都不会被占用的。而且这样还有个好处,在别的文件中可以include这个*.h文件,这样,在这个文件中,编译器就可以识别你的自定义类型了,目的不就达到了? 假如我在global.h中定义了

typedef struct _POSITION

{

int x;

int y;

}POSITION;

那么我可以在一个global.c文件中实现全局变量的定义,不过要include那个*.h文件,比如

/* ***global.c ******* */

include “global.h”

POSITION current,;

这样就定义了cunrrent这个变量,在别的文件中引用这个变量时,只要extern POSITION current;进行声明,然后就可以用了,不过这个文件也还得include "global.h" 因为如果不包含,在这个文件中是不识别POSITION类型的。

1.如何引用一个已经定义过的全局变量?  

答:extern  可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。

2.全局变量可不可以定义在可被多个.C文件中?为什么?   

答:可以,在不同的C文件中以static形式来声明同名全局变量。 可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。

=======================================

“我是一名从事了10年开发的老程序员,最近我花了一些时间整理关于C语言、C++,自己有做的材料的整合,一个完整的学习C语言、C++的路线,学习材料和工具。全球最大的C/C++、编程爱好者的聚集地就在我这里 <进入下方专栏即可看到及领取>!欢迎初学和进阶中的小伙伴。希望你也能凭自己的努力,成为下一个优秀的程序员。工作需要、感兴趣、为了入行、转行需要学习C/C++的伙伴可以跟我一起学习!”

关注我的专栏,带你遨游代码世界!

程序猿​zhuanlan.zhihu.com

最后分享一张C/C++学习路线图给爱学习的小伙伴们

c 包含其他文件_C语言:全局变量在多个c文件中公用的方法!相关推荐

  1. graphics.h头文件_C语言图形(graphics.h头文件功能和示例)

    graphics.h头文件 C中的颜色说明 (Color Description in C) setbkcolor sets the background to the color specified ...

  2. 语言全局变量跨文件_C 语言课上不会讲的一些问题

    基础认识:程序在内存中的基本结构 在大多数操作系统中,一个程序加载到内存后会被分配一个虚拟的内存地址,范围从0到一个非常大的不确定值.这个虚拟内存对应的物理内存映射是操作系统管理的,多数情况它在主存( ...

  3. c语言头文件和源文件_C语言头文件防卫式声明

    C语言一般提供三种预处理功能:宏处理.文件包含.条件编译.头文件防卫式申明中会用到条件编译中 #ifndef.#define.#endif 的用法.所以,首先价绍下条件编译. 1 条件编译 一般情况下 ...

  4. c语言删除文件中的结构体_C语言插入、删除、更改文件内容

    我们平时所见的文件,例如 txt.doc.mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件. 除了顺序文件,还有索引文件.散列文件等,一般用于特殊领域, ...

  5. c语言getchar在哪个头文件_c语言入门(一)

    知识点1[写代码的过程] 编辑器:程序员写代码的过程(记事本.vc6.0.vim)(让程序员看懂) 编译器:查看代码的语法错误,生成汇编语言. 汇编器:将生成好汇编语言 生成 二进制语言(目标文件) ...

  6. 第十一章 文件操作_C语言插入、删除、更改文件内容

    我们平时所见的文件,例如 txt.doc.mp4 等,文件内容是按照从头到尾的顺序依次存储在磁盘上的,就像排起一条长长的队伍,称为顺序文件. 除了顺序文件,还有索引文件.散列文件等,一般用于特殊领域, ...

  7. python读取dat数据_dat文件读写_c语言读写dat文件_c语言读dat文件 - 云+社区 - 腾讯云...

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 13 }文件读写:写入目录的获取比较麻烦,各个平台不同,所以用c++自己的文件读 ...

  8. c语言一个整数各位数字个数_C语言编写程序输出10个整数中最小值或最大值

    C语言编写程序输出10个整数中最小值或最大值 这是一个比较基础,同时也包含C语言中诸多特点的程序,仔细体会有很多的格式规则和技巧.其中包括:输入语句,输出语句,数组,分支结构,循环结构.希望广大C语言 ...

  9. C语言调用dbf文件,C语言直接读取FOXBASE的DBF文件.pdf

    C语言直接读取FOXBASE的DBF文件 维普资讯 1◇-l 1(Bs I 据 的读取 . 一 . 问题的提出 表 1 DBF文件的文件参数表 FOXBAsE有时在与外界进行数据交换 .提高数据 位置 ...

最新文章

  1. linux内核路由反向检查,Linux非对称路由
  2. 网上的python教程值不值得买_Python新人入手线程技术教程,值得收藏
  3. cytocape绘图(三)
  4. zabbix_agent安装(Centos+Ubuntu)
  5. Unity 8 和 Snap 将会是 Ubuntu 的未来
  6. 微信小程序集成腾讯云 IM SDK
  7. 高等组合学笔记(十五):容斥原理,错排问题
  8. golang调用c++的dll库文件
  9. 十个个必装的火狐插件
  10. 基于Python的拉勾网的模拟登录获取cookie
  11. Java网络编程(BIO和NIO)
  12. R语言中is.na()
  13. OpenStack社区周报:Neutron网络之负载均衡,设计OpenStack云时需要避开的十个误区...
  14. 一文带你学会使用小程序CMS内容管理
  15. 在通用计算机系统中系统软件,计算机系统中系统软件的核心是什么
  16. 网吧服务器网络维护教程,网管员维护服务器过程中的反黑技巧
  17. API常用类之Arrays类
  18. Yo(Yeoman)
  19. Nginx——缓存配置
  20. “我们的开源项目”发起人、息壤开源社区共同创始人——程旭文专访

热门文章

  1. 2345王牌浏览器九宫格个性化设置
  2. 腾讯视频上传视频如何同步到企鹅号
  3. 下如何查看mysql表单_Navicat 教程:如何进行表单查看
  4. 幼儿课外活动游戏_泰国清迈大小学校介绍 --【Little Star小星星幼儿园】
  5. 使用TortoiseGit(小乌龟)操作分支的创建
  6. 深入理解static关键字
  7. windows和linux系统下测试端口连通性的命令
  8. java中运算的注意事项
  9. Java常用设计模式————适配器模式
  10. Markdown简明使用