C语言extern作用(全局变量)

用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文件中定义,我这里只是在外部用它。编译器就不给他分配内存空间,而等到真正遇到变量定义的时候再给他分配内存空间。

  由于很多人从开始学C语言就一直把定义变量声明变量,一开始就叫错了,所以导致现在分不清定义声明的区别。要是还理解不了就想想函数的定义声明,函数定义是编写函数功能实体,编译器要编译这个函数并且要分配内存空间,而函数声明并不生成函数功能实体,只是告诉编译器这是个函数,这个函数在后面将会定义实体,我这里只是提前用,编译器就会接着继续往下编译,如果子函数写在main函数之后,那么声明是必须的,如果不声明函数编译器都不知道这是个函数,编译就会报错。

转载自:http://dlutnaga.blog.sohu.com/176525248.html

时间: 2024-11-08 19:36:46

C语言extern作用(全局变量)的相关文章

C语言extern引用AT&T汇编中的变量,任意转换类型

今天研究出了一个小问题,在C语言里引用汇编的变量,会是什么结果,汇编中的变量没有像C语言中int类型那样的类型约束,可以把数据当作任何类型处理,那么传到C语言中我们应该当作什么类型处理呢. 换句话说,在汇编里定义变量var,在C语言里引用,我们肯定要用extern声明var外部变量,那么extern后面接什么类型?难道是extern int var么?还是 extern short var 实例: 一. 汇编程序:(是的,就这么短小) .global var  #注意现在的汇编器不再要求被C语言

彻底搞懂extern关键字&&全局变量定义问题

最近在学Lua,关于Lua编译的地方,由于Lua是用C语言写的,在C++中使用C语言的函数,需要使用extern "C"编译才能过,之前貌似没有接触过这方面的知识,写个blog纪念一下,顺便整理一下extern关键字的作用. 一.extern "C"的作用 这是我第一次见,因为之前一直没有过C++去调用C的函数.关于C++和C语言混合编程其实还有一些地方要注意的.比如,如果编译时出现下面的错误: error:预编译头文件来自编译器的早期版本,或者预编译头为 C++

C语言extern的使用以及头文件*.h的内容格式注意

用VS2013 分开写多文件的程序,出现了许多重定义的问题,总结解决方法如下: 在*.h文件中使用以下的格式: #ifndef <标识> #define <标识> ...... ...... #endif <标识>在理论上来说可以是自由命名的,但每个头文件的这个"标识"都应该是唯一的.标识的命名规则一般是头文件名全大写,前后加下划线,并把文件名中的"."也变成下划线,如:stdio.h #ifndef _STDIO_H_ #def

C语言中定义全局变量

(1)在C语言的头文件中定义变量出现的问题 最好不要傻嘻嘻的在头文件里定义什么东西.比如全局变量: /*xx头文件*/ #ifndef  _XX_头文件.H #define  _XX_头文件.H int A; #endif 那么,很糟糕的是,这里的int A是个全局变量的定义,所以如果这个头文件被多次引用的话,你的A会被重复定义,显然语法上错了.只不过有了这个#ifndef的条件编译,所以能保证你的头文件只被引用一次,不过也许还是不会出岔子,但若多个c文件包含这个头文件时还是会出错的,因为宏名有

c语言中实现全局变量

在用C语言编写程序的时候,我们常常想定义一个可以在不同.c文件中被使用的变量,以此来实现数据的传递.但是这个变量定义的不对的话,就会在编译时出现编译错误,或者可以编译通过,但是没有实现变量在不同.c文件中实现共用.正确的全局变量定义方式是这样的. 我们举例说明,项目文件夹project下有main.c.common.c和common.h三个文件,其中common.h文件分别#include在main.c和common.c文件中.现在希望声明一个字符型变量key,在main.c和common.c中

20151023-const、static、extern作用

1.关键字const什么含义 const int a; int const a; const int *a; int const *a; int * const a; int const * const a; 前两个的作用是一样的:a是一个常整型数 第三第四个意味着:a是一个指向常整型数的指针(整型数是不可修改的,但是指针可以) 第五个:a是一个指向整形数的常指针(指针指向的整型数是可以修改的,但是指针不能修改) 最后一个意味着:a是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指

C语言局部变量和全局变量的区别。——Arvin

局变量是使用相同的内存块在整个类中存储一个值. 全局变量的存在主要有以下一些原因: 1,使用全局变量会占用更多的内存(因为其生命期长),不过在计算机配置很高的今天,这个不成为什么问题,除非使用的是巨大对象的全局变量,能避免就一定要避免. 2,使用全局变量程序运行时速度更快一些(因为内存不需要再分配),同样现在也快不了多少. 3,对于局部变量的名字空间污染,这个在不使用太多变量时是可以避免的. 总之,全局变量可以使用,但是全局变量使用时应注意的是尽可能使期名字易于理解,而且不能太短,避免名字空间的

ios开发使用extern访问全局变量

使用extern关键字法: 1 .新建Constants.h文件(文件名根据需要自己取),用于存放全局变量: 2. 在Constants.h中写入你需要的全局变量名,但是在定义时不能对其进行初始化,否则就出错例如: NSString *url;//指针类型                 int count;//非指针类型 3  .在需要用到全局变量的文件中引入此文件: #import "Constants.h" 4.给全局变量初始化或者赋值: extern NSString *url

C语言之局部变量&amp;全局变量&amp;变量存储方式

一.角度分析: 变量作用域 -------> 局部变量和全局变量 变量存在的生存期 ---------> 静态存储方式和动态存储方式 二.局部变量: 局部变量也称为内部变量.局部变量是在函数内作定义说明的.其作用域仅限于函数内,离开函数后再使用这种变量是非法的. 例子: 关于局部变量的作用域还要说明以下几点: 1)主函数也是一个函数,它与其他函数是平行关系.主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用.同时,主函数中也不能使用其他函数中定义的变量. 2)形参变量是属于被调函数的