- 小菜G的建站之路
-
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。
1. extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a.c中声明extern int v,还取决于变量v本身是能够被引用到的。这涉及到c语言的另外一个话题--变量的作用域。能够被其他模块以extern修饰符引用到的变量通常是全局变量。还有很重要的一点是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函数fun定义的开头处声明extern int v,然后就可以引用到变量v了,只不过这样只能在函数fun作用域中引用v罢了,这还是变量作用域的问题。对于这一点来说,很多人使用的时候都心存顾虑。好像extern声明只能用于文件作用域似的。
2. extern修饰函数声明。从本质上来讲,变量和函数没有区别。函数名是指向函数二进制块开头处的指针。如果文件a.c需要引用b.c中的函数,比如在b.c中原型是int fun(int mu),那么就可以在a.c中声明extern int fun(int mu),然后就能使用fun来做任何事情。就像变量的声明一样,extern int fun(int mu)可以放在a.c中任何地方,而不一定非要放在a.c的文件作用域的范围中。对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。使用extern和包含头文件来引用函数有什么区别呢?extern的引用方式比包含头文件要简洁得多!extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这大概是KISS原则的一种体现吧!这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。
extern "C"的含义
extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。
被extern "C"限定的函数或变量是extern类型的;
被extern "C"修饰的变量和函数是按照C语言方式编译和链接的
首先看看C++中对类似C的函数是怎样编译的。
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:
void foo( int x, int y );
该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。
_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。 例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。
同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以"."来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。
举例说明
(1)未加extern "C"声明时的连接方式
假设在C++中,模块A的头文件如下:
// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif
//在模块B中引用该函数:
// 模块B实现文件 moduleB.cpp
#include "moduleA.h"
foo(2,3);
实际上,在连接阶段,链接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号!
(2)加extern "C"声明后的编译和链接方式
加extern "C"声明后,模块A的头文件变为:
// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern "C" int foo( int x, int y );
#endif
在模块B的实现文件中仍然调用foo( 2,3 ),其结果是:
<1>A编译生成foo的目标代码时,没有对其名字进行特殊处理,采用了C语言的方式;
<2>链接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名_foo。
如果在模块A中函数声明了foo为extern "C"类型,而模块B中包含的是extern int foo(int x, int y),则模块B找不到模块A中的函数;反之亦然。
extern “C”这个声明的真实目的是为了实现C++与C及其它语言的混合编程。
- CarieVinne
-
在C++中external function是外部函数的意思,而外部函数有两种理解.(1)库函数是C语言的内部函数或自带函数,外部函数即程序员自定函数.
(2)凡加写了extern 的函数是外部函数.
什么时候定义变量使用“extern”?
首先纠正你的一个错误,extern是用来声明变量而不是定义变量的当你需要在一个c语言文件中使用另外一个c语言文件中定义的变量时就需要加上extern来声明,这样编译器就知道这个变量是在别的文件中定义的。比如:你在foo.c中定义了一个全局变量int a=10,你在fff.c中想使用这个变量a,那么你就需要在使用之前在fff.c中用extern声明这个变量。extern int a;2023-06-09 18:25:041
extern是什么意思
extern是全局变量声明只要声明全局变量就默认 前面加extern(程序员可以不加,但编译器默认加上)若本文件 引用别的文件中的全局变量 一定要加上extern 声明一下例如 #include "my_Fun.c" extern int b;//b是在my_Fun.c中声明了的一个全局变量 这个extern 是个声明他可以在任何地方声明 引用了一个全局变量 (可以试试 在main()函数执行完之后声明 也不会出错)这样在 工程的总头文件中就不需要考虑 先#include 哪个文件了2023-06-09 18:25:131
C语言 extern
在C语言中,变量和函数都有数据类型和存储类型两个属性,因此变量定义的一般形式是 {存储类型 数据类型 变量名} C语言种提供了以下四种不同的存储类型 那么我们所说的extern就是存储类型的一种。extern修饰的变量存储位置在全局静态存储区。 标准的定义格式: extern 类型名 变量名; 通俗来说,如果使用extern修饰了一个变量或者函数,那么这个函数或者变量就变成了全局变量,在除定义该变量or函数的文件外仍然有效。不过需要注意的是,使用extern进行修饰是对该变量or函数进行声明,并没有分配内存。 如果在a.c中需要引用b.c中的int i,那么可以在a.c中使用extern int i进行声明。并且,能够被其他模块以extern修饰符引用的变量通常是全局变量。并且extern int i可以被放在a.c中的任何位置,区别只是在a.c中作用域的问题。 从本质上来说,并没有什么区别。函数名字本质上是一个指向二进制块开头处的指针。如果a.c中需要引用b.c中的函数,如b.c中原型是int fun(int mu),那么在a.c中声明extern int fun(int mu)那么就可以在a.c中用fun做事。 但是对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。 那么使用extern和包含头文件来引用函数有什么区别如下: ① 使用extern的引用比包含头文件要简介的多。extern使用直截了当,引用哪个函数直接extern进行声明即可。这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。 ② include本质上是把include进来的这个文件原封不动的搬到当前文件中 a.c b.c2023-06-09 18:25:231
C语言中全局变量说明符extern该如何使用?
函数和变量都有声明和定义两个写法。声明的目的是告诉别的代码这个变量的名称,而定义比声明多了一个功能,除了告知名称以外,还会为这个变量分配内存。对于函数来说,加不加extern都没有关系,因为有函数体一定是定义,加extern也会被忽略,而没有函数体的就是声明,int add(int a, int b); 等价于 extern int add(int a, int b);int add(int a, int b) { return a + b; } 等价于 extern int add(int a, int b) {return a+b;}如果是变量的话int a; // 定义了一个变量aextern int a; // 声明了一个变量a变量可以有任意个声明,但是只能有一个定义,全局变量定义在多个文件中,只能有一个文件中的不加extern,其余的都必须加extern表示声明。2023-06-09 18:25:314
C++中定义变量的时候用extern有什么用?
在全局范围:int i;这是定义,定义i,初始化为0。int i = 1;这是定义,定义i,初始化为1。extern int i = 1;这是定义,定义i,初始化为1。extern int i;这是声明,声明有一个变量i,它的定义可能在其它文件中。每个变量定义只能有一处。最好使每个变量都有且仅有一处定义。extern int i = 1;作用和int i = 1;没有区别,只是显式地提醒程序员i可能会在其它文件里用到。2023-06-09 18:25:456
.h中的extern变量
兄弟,你是想试试几个文件连在一起如何用吧,呵呵!你试着把三个文件中的这个extern delta,a,b,c;改成extern float delta;extern int a,b,c;就是连它的类型也要声明哦!2023-06-09 18:25:593
请教extern的作用
extern表示是外部函数或外部变量,比如:1、extern void add(int x,inty);表示该函数主体不在当前模块中,在另一个模块中(文件)2、extern int total;表示该变量在另一个模块总定义过。一般都把一些经常用到的枚举和变量之类的写在.h头文件中。这样要引用时直接include "头文件名"就可以了调用里面所有的枚举和变量了。在大型项目中,引用别的.c文件中的函数则只能用extern,因为.c文件是不能 include的。所以想引用别的.c文件中的函数和全局变量、枚举等等的就只能用extern。2023-06-09 18:26:061
用extern修饰全局变量
a = 5b = 25`````上面是函数里面的输出····下面是主函数的输出·····a = 5b = 15因为楼主你在函数体里面都有另外定义x y,所以你在函数体外面定义的自动被屏蔽了...2023-06-09 18:26:132
extern怎么用?
常见用法:1 声明变量或函数前加extern是用来告诉编译器这个变量或函数可能定义在其它文件模块中的。加extern声明的变量并不会真正分配存储空间,它表明这个变量必须是在别处定义过的,在这个文件中被共享的。2 在C++程序中,调用被C编译器编译后的函数,要加extern“C”声明。 因为 C和C++ 语言的编译规则不一样,通过extern“C”告诉编译系统哪些函数是用C 方式编译,哪些函数需要用C++ 方式编译。2023-06-09 18:26:362
嵌入式—C语言—全局变量和extern的用法
extern是声明外部变量,正如它的英文名字一样,你可以在其他文件当中使用它2023-06-09 18:26:453
extern可以定义局部变量吗?谢谢啦
不能!!!你说的是定义?还是声明?定义的时候,extern表示外部文件可以使用它,当然它至少得是全局的;全局变量默认是加上了extern的,与之相对的是static,它定义的全局变量,外部文件不能使用。声明的时候,它起一个扩展作用域的作用,它至少还是全局的,同一文件中,存在一个后面定义的全局变量,在文件开头添加一个extern的声明,前面的代码也可以使用这个变量了;其他的文件,在添加extern声明后,也可以使用它了。extern定义一个变量,与之相反的是static来定义,前者表示其他文件可以使用,后者表示其他文件不能使用。这些说的都是全局变量。局部变量定义的时候加上static是另外一个意思了,说的是该变量的存活期的问题,一直存在;这种情况下,没有extern的说法。2023-06-09 18:26:521
c++中 用extern声明外部变量时能不能给变量赋初值
一楼正解!2023-06-09 18:27:023
C++中extern是什么意思,用法?
extern表示是外部函数或外部变量,比如:1、extern void add(int x,inty);表示该函数主体不在当前模块中,在另一个模块中(文件)2、extern int total;表示该变量在另一个模块总定义过。2023-06-09 18:27:112
extern在c语言中是什么意思?
是一个修饰符。在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。另外,extern也可用来进行链接指定。可以通过把原函数名与参数信息结合,产生一个独特的内部名字:这种技术叫做名字修饰(Name Mangling)。名字修饰规则没有一个标准,所以不同的编译器的名字修饰规则也不一样。下面是一组函数,其中f()函数重载了:f(void)和f(int)是不同的函数,除了函数名相同以外没有任何关系。当生成obj目标文件时,为了区分它们,C++编译器根据参数信息进行了名字修饰:2023-06-09 18:27:351
c++中 用extern声明外部变量时能不能给变量赋初值
一楼正解!2023-06-09 18:28:153
extern在c语言中是什么意思?
extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这里起到的是声明作用范围的用处。extern的另外用法是当C和C++混合编程时假如c++调用的是c源文档定义的函数或变量,那么要加extern来告诉编译器用c方式命名函数:文档A.cpp调用a.c里面的变量i和函数callme()扩展资料C语言包含的各种控制语句仅有9种,关键字也只有32个,程序的编写要求不严格且以小写字母为主,对许多不必要的部分进行了精简。实际上,语句构成与硬件有关联的较少,且C语言本身不提供与硬件相关的输入输出、文件管理等功能,如需此类功能,需要通过配合编译系统所支持的各类库进行编程,故c语言拥有非常简洁的编译系统。2023-06-09 18:28:241
static和extern的区别
这个一楼的回答差了一些哦。有几种情况:首先,extern和static完全不同,extern不能定义一个变量,extern表示的是“已经存在一个变量,但是不在当前的编译单元内,需要在其他编译单元中寻找。”static会定义一个变量,但是分成多种情况。---------------------------------------------------------------------先说extern 和 变量的关系。先说只有一个文件(编译单元)的:int i=10; //这个是定义一个全局变量,值为10extern int i=10; //这个是错误的,变量已经存在,怎么赋初值呢?extern int i; //这个和第一句 int i=10; 可以同时存在在一个文件中。再说跨文件(多个编译单元)的:文件一:(假设这个文件没有错误!!)int a=10;文件二:extern int a; // 这个正确extern float a; // 这个编译不会错,赋值会怎样呢?extern int b; //这个找不到int a=9; //这个出错,全局变量多次定义int a; //同上static int a=9; //这个正确,这个产生一个仅在文件二中有效的全局变量a,初值为9,注意在文件二中将看不到那个值为10的全局变量!!!!static就是刚才说的最后一种,此外就是函数内的使用了,不再多说了。特别的,这样是错误的:a.c:static int x=10;b.c:extern int x; //因为x只在a.c中,b.c中根本看不到x,所以这个extern还是找不到x,因此会在链接时报错。其他:extern尽量写到.h文件中,写到.c里就是错误的种子,以后它只能得到苦果!2023-06-09 18:28:371
VC++中创建了一个工程,里面有n个头文件,如何在一个头文件中使用另一个头文件中的全局变量?谢谢!
加 extern2023-06-09 18:28:457
extern 外部变量可以在动态链接库之间起作用吗?
假设有两个动态链接库libA.dylib、libB.dylib(或者*.so、*.dll),有一个公共头文件HelloGlobal.h,里面有一个extern int GlobalInteger变量,而libA的作用是设置变量的值、libB获得值(setter / getter); HelloGlobal.h #ifndef __HELLO_GLOBAL_H__ #define __HELLO_GLOBAL_H__ extern int GlobalInteger; #endif // __HELLO_GLOBAL_H__ libA.h #ifndef __LIB_A_H__ #define __LIB_A_H__ void SetGlobalInteger(); #endif // __LIB_A_H__ libA.c #include "LibA.h" #include "HelloGlobal.h" int GlobalInteger; void SetGlobalInteger() { GlobalInteger = 101; } libB.h #ifndef __LIB_B_H__ #define __LIB_B_H__ void GetGlobalInteger(); #endif // __LIB_B_H__ libB.c #include #include "LibB.h" #include "HelloGlobal.h" int GlobalInteger; void GetGlobalInteger() { printf("%s, line %d GlobalInteger %d ", __FILE__, __LINE__, GlobalInteger); } HelloGlobal.c #include #include "HelloGlobal.h" #include "libA.h" #include "libB.h" #include "ExternFile.h" int GlobalInteger; int main() { SetGlobalInteger(); GetGlobalInteger(); ExternSetGlobalInteger(); printf("GlobalInteger %d ", GlobalInteger); return 0; } extern变量在libA和libB动态链接库之间不能作用于“外部”,而使用外部源头件ExternFile.h可以使extern变量作用于外部;动态链接库之间类似进程之间的通讯 ^_^2023-06-09 18:29:001
extern是在定义变量时用还是引用变量是用
extern只是申明吧在c里面应该只是申明2023-06-09 18:29:152
C语言中变量存储static和extern两个关键字的作用分别是什么
在C语言中,static可以用来修饰局部变量,全局变量以及函数。在不同的情况下static的作用不尽相同。(1)修饰局部变量一般情况下,对于局部变量是存放在栈区的,并且局部变量的生命周期在该语句块执行结束时便结束了。但是如果用static进行修饰的话,该变量便存放在静态数据区,其生命周期一直持续到整个程序执行结束。但是在这里要注意的是,虽然用static对局部变量进行修饰过后,其生命周期以及存储空间发生了变化,但是其作用域并没有改变,其仍然是一个局部变量,作用域仅限于该语句块。在用static修饰局部变量后,该变量只在初次运行时进行初始化工作,且只进行一次。如:#include<stdio.h>void fun(){staticint a=1;a++;printf("%d ",a);}int main(void){fun();fun();return0;}程序执行结果为: 23说明在第二次调用fun()函数时,a的值为2,并且没有进行初始化赋值,直接进行自增运算,所以得到的结果为3.对于静态局部变量如果没有进行初始化的话,对于整形变量系统会自动对其赋值为0,对于字符数组,会自动赋值为"".(2)修饰全局变量对于一个全局变量,它既可以在本源文件中被访问到,也可以在同一个工程的其它源文件中被访问(只需用extern进行声明即可)。如:有file1.cint a=1;file2.c#include<stdio.h>extern int a;int main(void){printf("%d",a);return 0;}则执行结果为 1但是如果在file1.c中把int a=1改为static int a=1;那么在file2.c是无法访问到变量a的。原因在于用static对全局变量进行修饰改变了其作用域的范围,由原来的整个工程可见变为本源文件可见。(3)修饰函数用static修饰函数的话,情况与修饰全局变量大同小异,就是改变了函数的作用域。extern关键字在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。在上面的例子中可以看出,在file2中如果想调用file1中的变量a,只须用extern进行声明即可调用a,这就是extern的作用。在这里要注意extern声明的位置对其作用域也有关系,如果是在main函数中进行声明的,则只能在main函数中调用,在其它函数中不能调用。其实要调用其它文件中的函数和变量,只需把该文件用#include包含进来即可,为啥要用extern?因为用extern会加速程序的编译过程,这样能节省时间。2023-06-09 18:29:221
extern 只是用来声明全局变量
extern只是外部引用,不能用来定义。假如用extern定义的话,编译不会报错,链接时会出错,extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。2023-06-09 18:30:011
C语言中全局变量的作用范围?及全局变量和extern定义变量的区别?
顾名思义啊2023-06-09 18:30:085
c语言中extern怎么用,举个简单例子说明下,谢谢。
一般是在一个文件A中对于其他文件中的全局变量或者全局函数需要调用时,先在文件的开头extern一下,相当于在A文件中声明了其他文件中的变量和函数,使得这个变量和函数在这个文件中就可以使用了。例如在文件a.c中有个变量x,一个函数b();你在文件b.c中想要使用这个变量x和函数b(),只需要在b.c文件的开头extern一下这个变量就可以了。2023-06-09 18:30:242
C语言extern向程序说明变量在其他地方定义了,这个“其他地方”是指哪儿呢?
在该工程下其他的文件中,比如f1.c要用f2.c中的一个变量,就要在f1.c中用extern声明该变量。2023-06-09 18:30:351
c语言中的extern什么意思
extern是全局变量声明,只要声明全局变量就默认 前面加extern(程序员可以不加,但编译器默认加上)若本文件 引用别的文件中的全局变量 一定要加上extern 声明一下。 例如 #include "my_Fun.c" extern int b;//b是在my_Fun.c中声明了的一个全局变2023-06-09 18:30:421
extern用法
声明该变量来自外部文件,不需要在此定义2023-06-09 18:30:492
第12个关键字应该是extern
extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行链接指定。2023-06-09 18:30:561
c语言中extern的意思是什么??
extern是全局变量声明只要声明全局变量就默认 前面加extern(程序员可以不加,但编译器默认加上)若本文件 引用别的文件中的全局变量 一定要加上extern 声明一下例如 #include "my_Fun.c"extern int b;//b是在my_Fun.c中声明了的一个全局变量这个extern 是个声明他可以在任何地方声明 引用了一个全局变量 (可以试试 在main()函数执行完之后声明 也不会出错)这样在 工程的总头文件中就不需要考虑 先#include 哪个文件了2023-06-09 18:31:207
什么时候定义变量使用“extern”?
首先纠正你的一个错误,extern是用来声明变量而不是定义变量的x0dx0ax0dx0a当你需要在一个c语言文件中使用另外一个c语言文件中定义的变量时就需要加上extern来声明,这样编译器就知道这个变量是在别的文件中定义的。x0dx0a比如:你在foo.c中定义了一个全局变量int a=10,你在fff.c中想使用这个变量a,那么你就需要在使用之前在fff.c中用extern声明这个变量。extern int a;2023-06-09 18:32:031
C语言中extern i=3是声明,还是定义,这应该是定义吧,那extern什么意思呢?谢谢了
extern是全局变量声明只要声明全局变量就默认 前面加extern(程序员可以不加,但编译器默认加上)若本文件 引用别的文件中的全局变量 一定要加上extern 声明一下例如 #include "my_Fun.c" extern int b;//b是在my_Fun.c中声明了的一个全局变量 这个extern 是个声明他可以在任何地方声明 引用了一个全局变量 (可以试试 在main()函数执行完之后声明 也不会出错)这样在 工程的总头文件中就不需要考虑 先#include 哪个文件了2023-06-09 18:32:101
C语言中extern的意思是什么
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”链接指示后,上面的代码就能够正常运行了。2023-06-09 18:32:171
C函数前加extern是什么意思?
C函数前加extern表示该函数已经在其他文件中定义。extern的定义:extern是C,C++中的一个关键字。extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。另外,extern也可用来进行链接指定。2023-06-09 18:32:521
C语言中,extern 修饰函数是什么意思?
加上以后 外部函数可以调用该函数2023-06-09 18:33:026
"extern ""c""作用"
extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这里起到的是声明作用范围的用处。extern的另外用法是当C和C++混合编程时假如c++调用的是c源文档定义的函数或变量,那么要加extern来告诉编译器用c方式命名函数:文档A.cpp调用a.c里面的变量i和函数callme()相关内容:C语言包含的各种控制语句仅有9种,关键字也只有32个,程序的编写要求不严格且以小写字母为主,对许多不必要的部分进行了精简。实际上,语句构成与硬件有关联的较少,且C语言本身不提供与硬件相关的输入输出、文件管理等功能,如需此类功能,需要通过配合编译系统所支持的各类库进行编程,故c语言拥有非常简洁的编译系统。2023-06-09 18:33:211
C函数前加extern是什么意思?
C函数前加extern表示该函数已经在其他文件中定义。extern的定义:extern是C,C++中的一个关键字。extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。另外,extern也可用来进行链接指定。2023-06-09 18:33:331
为什么包含初始化式的extern声明不能位于函数内
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用。1. extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a.c中声明extern int v,还取决于变量v本身是能够被引用到的。这涉及到c语言的另外一个话题--变量的作用域。能够被其他模块以extern修饰符引用到的变量通常是全局变量。还有很重要的一点是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函数fun定义的开头处声明extern int v,然后就可以引用到变量v了,只不过这样只能在函数fun作用域中引用v罢了,这还是变量作用域的问题。对于这一点来说,很多人使用的时候都心存顾虑。好像extern声明只能用于文件作用域似的。2. extern修饰函数声明。从本质上来讲,变量和函数没有区别。函数名是指向函数二进制块开头处的指针。如果文件a.c需要引用b.c中的函数,比如在b.c中原型是int fun(int mu),那么就可以在a.c中声明extern int fun(int mu),然后就能使用fun来做任何事情。就像变量的声明一样,extern int fun(int mu)可以放在a.c中任何地方,而不一定非要放在a.c的文件作用域的范围中。对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。使用extern和包含头文件来引用函数有什么区别呢?extern的引用方式比包含头文件要简洁得多!extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。这大概是KISS原则的一种体现吧!这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。3. 此外,extern修饰符可用于指示C或者C++函数的调用规范。比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数。这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同2023-06-09 18:33:402
extern在c语言中是什么意思
extern关键字可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。这里起到的是声明作用范围的用处。extern的另外用法是当C和C++混合编程时假如c++调用的是c源文档定义的函数或变量,那么要加extern来告诉编译器用c方式命名函数:文档A.cpp调用a.c里面的变量i和函数callme()相关内容:C语言包含的各种控制语句仅有9种,关键字也只有32个,程序的编写要求不严格且以小写字母为主,对许多不必要的部分进行了精简。实际上,语句构成与硬件有关联的较少,且C语言本身不提供与硬件相关的输入输出、文件管理等功能,如需此类功能,需要通过配合编译系统所支持的各类库进行编程,故c语言拥有非常简洁的编译系统。2023-06-09 18:33:481
《c语言》中“extern”怎么用?
extern是外部声明用的,用来声明外部的函数或者变量定义。例如,你在1.C中定义了一个函数和变量:void fun1(void);int a = 0;而你要在2.c中调用 fun1(),并且读取a的值,那么需要再2.c的头部如下外部声明:extern void fun1(void);extern int a = 0;这样的话在编译器在编译2.c时,不会报错误,而在链接时找fun1、a,以实现对外部函数、变量的访问。2023-06-09 18:34:141
关于C++中extern全局变量的问题
LPINTERINFOg_lpInterInfo=newINTERINFO;=>g_lpInterInfo=newINTERINFO;试试看。上面的写法可能是在本CPP的某个函数里面又申请了一个局部变量。没有改变那个全局变量。如果一定要重名,使用:::g_lpInterInfo=newINTERINFO;2023-06-09 18:34:211
static和extern的区别
有几种情况:首先,extern和static完全不同,extern不能定义一个变量,extern表示的是“已经存在一个变量,但是不在当前的编译单元内,需要在其他编译单元中寻找。”static会定义一个变量,但是分成多种情况。---------------------------------------------------------------------先说extern和变量的关系。先说只有一个文件(编译单元)的:inti=10;//这个是定义一个全局变量,值为10externinti=10;//这个是错误的,变量已经存在,怎么赋初值呢?externinti;//这个和第一句inti=10;可以同时存在在一个文件中。再说跨文件(多个编译单元)的:文件一:(假设这个文件没有错误!!)inta=10;文件二:externinta;//这个正确externfloata;//这个编译不会错,赋值会怎样呢?externintb;//这个找不到inta=9;//这个出错,全局变量多次定义inta;//同上staticinta=9;//这个正确,这个产生一个仅在文件二中有效的全局变量a,初值为9,注意在文件二中将看不到那个值为10的全局变量!!!!static就是刚才说的最后一种,此外就是函数内的使用了,不再多说了。特别的,这样是错误的:a.c:staticintx=10;b.c:externintx;//因为x只在a.c中,b.c中根本看不到x,所以这个extern还是找不到x,因此会在链接时报错。其他:extern尽量写到.h文件中,写到.c里就是错误的种子,以后它只能得到苦果!2023-06-09 18:34:281
extern修饰的外部变量可以随意改变其值吗
可以改变。定义为全局变量。2023-06-09 18:34:381
一外部变量在其它文件中用extern来声明,其它文件中没有extern,就不会访问该变量,那么static 的意义何在
static 是静态变量,是全局变量,变量的作用域在整个程序运行时都一直有效。而extern用到的情况是局部变量情况,局部变量的作用域在该子程序里头,子程序结束他的申请空间就释放出来,有时用extern将子程序里头的局部变量的作用域引出来,使该局部变量的作用域继续有效2023-06-09 18:34:462
c++ extern的用法,extern全局变量和static,const的的区别
extern 主要是作用域,一个文件一个作用域。static作用域是 本文件。 static 在类中也是只属于这个类,所有的对象。const只是一个编译器实现的常数。语义常数。多看代码就知道了。很多人对这个的理解不一样。多调程序就明白其中的机制了。有人说生命周期。有人说文件能否访问,我觉得就是东西在不在的问题。不必吹毛求疵2023-06-09 18:34:531
c++ extern mt 变量, 请问mt代表什么意思?
extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义mt在别处被定义过,这里只是声明有这么一个东西2023-06-09 18:35:001
.h与.c文件变量引用问题
你在编译器上试试就清楚了。。。结果是:可以。2023-06-09 18:35:084
通达信externvalue怎么使用
全局变量区分静态全局变量和全局变量两种。1 静态全局变量。有static修饰的变量为静态全局变量。需要定义在函数外,可以在定义位置到本文件结束部分使用。定义格式为static type var=init_value;作用为定义一个类型为type,变量名为var的静态全局变量,并赋初始化值为init_value。当=init_value部分被省略时,系统自动初始化为0值。可以用extern扩展可使用空间,声明格式为extern type var;注意不可以有初始化值。extern声明只允许出现在本文件内,声明后,可以在声明语句到文件尾使用该变量。2 全局变量。没有static修饰的变量为全局变量。需要定义在函数外,可以在定义位置到本文件结束部分直接使用。定义格式为type var=init_value;作用为定义一个类型为type,变量名为var的全局变量,并赋初始化值为init_value。当=init_value部分被省略时,系统自动初始化为0值。要在文件其它位置或其它文件中使用时,需要用extern进行声明,声明格式为extern type var;注意不可以有初始化值。声明后,可以在声明语句到声明语句所在文件尾使用该变量。也可以写在头文件中,这样在引用该头文件的C文件中,可以在引用位置到文件结尾使用该变量。2023-06-09 18:35:171
C语言:用extern和不用extern声明方法有什么区别?
是这样的如果你想定义一个静态函数要在函数返回值类型前加static如果你想定义一个外部函数要在函数返回值类型前加extern(可省略)也就是说默认为extern的2023-06-09 18:35:382
static和extern的区别
static:一、在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。1、定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点。a.在全局数据区分配内存。b.如果没有初始化,其默认值为0.c.该变量在本文件内从定义开始到文件结束可见,且在外部文件不可见. 2、定义局部静态变量:在局部变量前面加上关键字static,其特点如下:a.该变量在全局数据区分配内存。b.它始终驻留在全局数据区,直到程序运行结束。c. 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。 3、定义静态函数:在函数返回类型前加上static关键字,函数即被定义为静态函数,其特点如下:a.静态函数只能在本源文件中使用b.在文件作用域中声明的inline函数默认为static类型二、在C++中新增了两种作用:定义静态数据成员或静态函数成员。静态数据成员:a.内存分配:静态数据成员在程序的全局数据区去分配。b.初始化和定义: 静态数据成员必须在类定义外初始化,但const静态数据成员除外,const静态数据成员可以在类体中初始化(也可以像非const一样在类外初始化)。例如: class c1{public:private:static int num;static const string name = "chio";};int c1::num = 20;//没有const修饰的静态成员数据,必须类外定义并且初始化静态函数成员:类成员函数(无论是static成员函数或非static成员函数)都可以直接访问static数据成员,但是static成员函数只能访问static数据成员。并且可以通过类名直接调用. extern:extern可以置于变量或函数前,以在别的文件中标识变量或函数的定义,并提示编译器遇到此变量或函数时在其他模块中寻找其定义.extern在局部函数中声明时,表示此变量,在局部函数外(包括函数外,和文件外).extern声明的变量(即文件公用的变量)最好放在头文件中对于extern变量来说,仅仅是一个变量的声明,其并不是定义,不会分配内存空间。 extern表示将变量或函数声明为外部链接,变量默认是内部链接,函数默认是外部链接。因此用来外部链接的函数,声明时有无extern都可以连接通过。而全局变量则不行。通常,在模块的头文件中,对本模块提供给其他模块引用的函数和全局变量以关键字extern声明。2023-06-09 18:35:461
在C语言中,extern的作用是什么?
extern表示是外部函数或外部变量,比如:1、externvoidadd(intx,inty);表示该函数主体不在当前模块中,在另一个模块中(文件)2、externinttotal;表示该变量在另一个模块总定义过。一般都把一些经常用到的枚举和变量之类的写在.h头文件中。这样要引用时直接include"头文件名"就可以了调用里面所有的枚举和变量了。在大型项目中,引用别的.c文件中的函数则只能用extern,因为.c文件是不能include的。所以想引用别的.c文件中的函数和全局变量、枚举等等的就只能用extern。2023-06-09 18:35:575