百度
360搜索
搜狗搜索

extern关键字,怎样用extern关键字为一个局部变量做引用性声明详细介绍

本文目录一览: C语言中extern关键字的作用

extern 关键字 声明一个“外部变量” 。有了这个声明,就可以从声明开始的地方,合法地使用该外部变量了。
在例1中,我们在最后才定义了外部变量 g_X , g_Y ,由于外部变量定义的位置在main函数之后,因此本来我们在main函数中是不能够引用 g_X , g_Y 的,因为在使用的时候并没有定义它们的数值。现在我们在main函数中用 extern 对它们进行“外部变量声明”,就可以从声明的位置起使用它们了。
对于多个文件的工程,都可以采用例2的方法。 对于模块化的程序文件,可以先预留好外部变量的接口,也就是只采用 extern 声明变量,而不定义变量值,像例2中的 max.c 中那样。变量值的定义留给使用者。
通常,这些外部变量的接口都是在模块程序的 头文件 中声明的。当需要使用该模块时,只需在使用时具体定义一下外部变量即可。比如main.c中的 g_X , g_Y 。 不过需要注意,由于用 extern 引用外部变量,可以在引用的模块内修改变量的值,因此如果有多个文件同时对引用的变量进行操作,并且可能会修改该变量,那么就会影响其他模块的使用。因此需要慎重使用。
总结
一般来说,头文件只能声明函数和变量,其定义只能在某个.c文件中

C语言中extern的意思是什么?

extern是全局变量声明
只要声明全局变量就默认 前面加extern(程序员可以不加,但编译器默认加上)
若本文件 引用别的文件中的全局变量 一定要加上extern 声明一下
例如 #include "my_Fun.c"
extern int b;//b是在my_Fun.c中声明了的一个全局变量
这个extern 是个声明他可以在任何地方声明 引用了一个全局变量 (可以试试 在main()函数执行完之后声明 也不会出错)
这样在 工程的总头文件中就不需要考虑 先#include 哪个文件了
extern表示是外部函数或外部变量,比如:
1、extern void add(int x,inty);表示该函数主体不在当前模块中,在另一个模块中(文件)
2、extern int total;表示该变量在另一个模块总定义过。
一般都把一些经常用到的枚举和变量之类的写在.h头文件中。这样要引用时直接include "头文件名"就可以了调用里面所有的枚举和变量了。在大型项目中,引用别的.c文件中的函数则只能用extern,因为.c文件是不能 include的。所以想引用别的.c文件中的函数和全局变量、枚举等等的就只能用extern。
extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
另外,extern也可用来进行链接指定。
extern 变量
在一个源文件里定义了一个数组:char a[6]; 在另外一个文件里用下列语句进行了声明:extern char *a; 请问,这样可以吗? 答案与分析: 1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern char a[ ]。 2)、例子分析如下,如果a[] = "abcd",则外部变量a=0x12345678 (数组的起始地址),而*a是重新定义了一个指针变量a的地址可能是0x87654321,直接使用*a是错误的. 3)、这提示我们,在使用extern时候要严格对应声明时的格式,在实际编程中,这样的错误屡见不鲜。 4)、extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。
函数
extern 函数1 常常见extern放在函数的前面成为函数声明的一部分,那么,C语言的关键字extern在函数的声明中起什么作用? 答案与分析: 如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显的区别: extern int f(); 和int f(); 当然,这样的用处还是有的,就是在程序中取代include “*.h”来声明函数,在一些复杂的项目中,我比较习惯在所有的函数声明前添加extern修饰。 extern 函数2 当函数提供方单方面修改函数原型时,如果使用方不知情继续沿用原来的extern申明,这样编译时编译器不会报错。但是在运行过程中,因为少了或者多了输入参数,往往会照成系统错误,这种情况应该如何解决? 答案与分析: 目前业界针对这种情况的处理没有一个很完美的方案,通常的做法是提供方在自己的xxx_pub.h中提供对外部接口的声明,然后调用方include该头文件,从而省去extern这一步。以避免这种错误。 宝剑有双锋,对extern的应用,不同的场合应该选择不同的做法。 extern “C” 在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢? 答案与分析: C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。 下面是一个标准的写法: //在.h文件的头上 #ifdef __cplusplus #if __cplusplus extern "C"{ #endif #endif /* __cplusplus */ … … //.h文件结束的地方 #ifdef __cplusplus #if __cplusplus } #endif #endif /* __cplusplus */
extern是全局变量声明
只要声明全局变量就默认 前面加extern(程序员可以不加,但编译器默认加上)
若本文件 引用别的文件中的全局变量 一定要加上extern 声明一下
例如 #include "my_Fun.c"
extern int b;//b是在my_Fun.c中声明了的一个全局变量
这个extern 是个声明他可以在任何地方声明 引用了一个全局变量 (可以试试 在main()函数执行完之后声明 也不会出错)
这样在 工程的总头文件中就不需要考虑 先#include 哪个文件了
extern是全局变量声明
只要声明全局变量就默认 前面加extern(程序员可以不加,但编译器默认加上)
若本文件 引用别的文件中的全局变量 一定要加上extern 声明一下
例如 #include "my_Fun.c"
extern int b;//b是在my_Fun.c中声明了的一个全局变量
这个extern 是个声明他可以在任何地方声明 引用了一个全局变量 (可以试试 在main()函数执行完之后声明 也不会出错)
这样在 工程的总头文件中就不需要考虑 先#include 哪个文件了
extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这里起到的是声明作用范围的用处。
extern的另外用法是当C和C++混合编程时假如c++调用的是c源文档定义的函数或变量,那么要加extern来告诉编译器用c方式命名函数:
文档A.cpp调用a.c里面的变量i和函数callme()
拓展资料1、可以通过把原函数名与参数信息结合,产生一个独特的内部名字,这种技术叫做名字修饰(Name Mangling)。名字修饰规则没有一个标准,所以不同的编译器的名字修饰规则也不一样。
下面是一组函数,其中f()函数重载了:
f(void)和f(int)是不同的函数,除了函数名相同以外没有任何关系。当生成obj目标文件时,为了区分它们,C++编译器根据参数信息进行了名字修饰:
2、C语言中没有名字修饰(Name Mangling),因为C语言不支持函数重载。但是如果C++中含有C代码,在编译时C++编译器对C代码的函数也会进行名字修饰,函数名变了以后,将导致在C运行库中找不到对应函数,发生链接错误。
为了防止C++编译器对C代码进行名字修饰,我们将C代码用extern “C”进行链接指定,告诉编译器,在生成中间文件时,不要对这部分代码进行名字修饰,而是生成符合C规则的中间符号名。
添加了extern “C”链接指示后,上面的代码就能够正常运行了。

extern c作用

extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这里起到的是声明作用范围的用处。
extern的另外用法是当C和C++混合编程时假如c++调用的是c源文档定义的函数或变量,那么要加extern来告诉编译器用c方式命名函数:
文档A.cpp调用a.c里面的变量i和函数callme()
相关内容:
C语言包含的各种控制语句仅有9种,关键字也只有32个,程序的编写要求不严格且以小写字母为主,对许多不必要的部分进行了精简。
实际上,语句构成与硬件有关联的较少,且C语言本身不提供与硬件相关的输入输出、文件管理等功能,如需此类功能,需要通过配合编译系统所支持的各类库进行编程,故c语言拥有非常简洁的编译系统。

extern的意思是什么?

为不确定的外部符号,如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。意思是:没有找到这个函数的实现。
连接错,这个_save_ts 肯定是声明,如果_save_ts 是一个函数的话,可能是你没有把.c或者.cpp文件加入工程。如果是一个全局变量,可能是你没有在.c或者.cpp文件中定义这个变量。
解决方法:检查该函数的实现部分是否存在或包含该函数的lib文件是否正确的链接进代码中,查明错误后修正即可通过链接。
扩展资料这个函数的.h文件格式如下:
1. 在keil 编译器中,extern这个关键字即使不声明,编译器也不会报错,且程序运行良好,但不保证使用其它编译器也如此。强烈建议加上,养成良好的编程规范。
2. .c文件中的函数只有其它模块使用时才会出现在.h文件中,像本地延时函数static void delay (uint us)即使出现在.h文件中也是在做无用功,因为其它模块根本不去调用它,实际上也调用不了它(static关键字的限制作用)。
3.注意本句最后一定要加分号”;”,相信有不少同学遇到过这个奇怪的编译器报错: error C132: 'xxxx': not in formal parameter list,这个错误其实是.h的函数声明的最后少了分号的缘故。
参考资料来源:百度百科-lnk2001

C语言中,extern关键字怎么使用?最好解释清楚一点。

其实说简单点就是你有两个以上的.C文件,如果把一个变量或者函数声明为extern,例:在文件a.c中声明extern a;那么这个变量a,就可以在文件b.c中使用,否则在b.c中无法使用这个变量。
extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相透明的,也就是说,在编译时,全局变量的可见域限制在文件内部。
如果你定义A.cpp和B.cpp中都定义了全局变量i。那么分别编译,都可以通过,但是链接时就会报错。
B.obj : error LNK2005: "int i" (?i@@3HA) already defined in A.obj
反之,如果我们希望A.cpp和B.cpp中使用的i是同一个i。也就是两个文件,共同使用同一个全局变量。如果我们不在B.cpp中定义i。那么编译时就会报错,提示
error C2065: 'i' : undeclared identifier
如果我们定义i就会出现上面所说的错误。
于是,我们需要extern关键字。告诉编译器。这个i我们在别的模块中定义过了。你要编译的话,取别的模块找一找。这样程序就能够自动去A.cpp中寻找i的定义。并且让它在B.cpp中可以被使用。

阅读更多 >>>  函数的由来或起源

怎样用extern关键字为一个局部变量做引用性声明

1、?  答:能,局部会屏蔽全局。要用全局变量,需要使用::  可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。  3、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?  答:可以,在不同的C文件中以static形式来声明同名全局变量。  可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错  4、语句for(;1;)有什么问题?它是什么意思?  答:和while(1)相同。  5、do……while和while……do有什么区别?  答:前一个循环一遍再判断,后一个判断以后再循环  6、请写出下列代码的输出内容  #include

在定义外部函数时,必须使用什么关键字

在C/C++中定义函数是没有必须使用的关键字的,如果声明一个函数是外部函数,则必须使用关键字:extern。

c++声明和定义有什么区别?

①变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。
②变量声明:用于向程序表明变量的类型和名字。
③定义也是声明:当定义变量时我们声明了它的类型和名字。
④extern关键字:通过使用extern关键字声明变量名而不定义它。
1.定义也是声明,extern声明不是定义,即不分配存储空间。extern告诉编译器变量在其他地方定义了。
例如:extern int i; //声明,不是定义
int i; //声明,也是定义
2.如果声明有初始化式,就被当作定义,即使前面加了extern。只有当extern声明位于函数外部时,才可以被初始化。
例如:extern double pi=3.1416; //定义
3.函数的声明和定义区别比较简单,带有{ }的就是定义,否则就是声明。
例如:extern double max(double d1,double d2); //声明
4.除非有extern关键字,否则都是变量的定义。
例如:extern int i; //声明
int i; //定义

程序设计风格:
1. 不要把变量定义放入.h文件,这样容易导致重复定义错误。
2. 尽量使用static关键字把变量定义限制于该源文件作用域,除非变量被设计成全局的。
3. 可以在头文件中声明一个变量,在用的时候包含这个头文件就声明了这个变量。
总结:
变量在使用前就要被定义或者声明。
在一个程序中,变量只能定义一次,却可以声明多次。
定义分配存储空间,而声明不会。
C++程序通常由许多文件组成,为了让多个文件访问相同的变量,C++区分了声明和定义。
变量的定义(definition)用于为变量分配存储空间,还可以为变量指定初始值。在程序中,变量有且仅有一个定义。
声明(declaration)用于向程序表明变量的类型和名字。定义也是声明:当定义变量的时候我们声明了它的类型和名字。可以通过使用extern声明变量名而不定义它。不定义变量的声明包括对象名、对象类型和对象类型前的关键字extern。
extern声明不是定义,也不分配存储空间。事实上它只是说明变量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。
只有当声明也是定义时,声明才可以有初始化式,因为只有定义才分配存储空间。初始化式必须要有存储空间来进行初始化。如果声明有初始化式,那么它可被当作是定义,即使声明标记为extern。
任何在多文件中使用的变量都需要有与定义分离的声明。在这种情况下,一个文件含有变量的定义,使用该变量的其他文件则包含该变量的声明(而不是定义)。

C语言中函数的存储类型和数据类型的意义是什么?

在C语言中,函数的存储类型和数据类型具有不同的意义和作用。
存储类型(Storage Class):
自动存储类型(auto):这是函数的默认存储类型,表示函数中的局部变量,它们在函数调用时被自动创建,并在函数执行完毕后被销毁。自动变量的作用域限于函数内部。
静态存储类型(static):静态存储类型的函数级别意味着函数内的静态变量,它们在函数调用之间保持其值,不会在函数调用结束时销毁。静态函数也可以使用static关键字进行声明,表示该函数只在当前源文件中可见,对其他源文件是不可见的。
外部存储类型(extern):外部存储类型用于函数的声明,表示该函数在其他文件中定义。通过使用extern关键字,可以在一个源文件中声明一个在另一个源文件中定义的函数。
数据类型(Data Type):
返回类型:函数的数据类型指定了函数返回值的类型。例如,int、float、double等。返回类型是函数定义的一部分,它定义了函数调用后将返回的值的类型。
参数类型:函数可以接受一定数量和类型的参数。参数类型指定了函数接受的参数的数据类型。参数类型在函数定义或声明中指定,它决定了函数在被调用时需要传递给它的参数的数据类型。
函数的存储类型和数据类型在C语言中起着不同的作用。存储类型定义了函数内部变量的生命周期和可见性,决定了它们在程序执行期间如何存储和访问。数据类型定义了函数返回值和参数的类型,确保函数处理正确的数据类型,并与其他部分的代码进行正确的交互。通过合理地使用存储类型和数据类型,可以在C语言中编写出结构良好、高效和可维护的函数。

网站数据信息

"extern关键字,怎样用extern关键字为一个局部变量做引用性声明"浏览人数已经达到21次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:extern关键字,怎样用extern关键字为一个局部变量做引用性声明的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!