C/C++中的extern的使用

看到一篇文章,对extern的说明简明易懂,特此说明并学习。https://blog.csdn.net/gerks/article/details/51913641

一、用extern声明外部变量
外部变量是在函数的外部定义的全局变量,它的作用域是从变量的定义处开始,到本程序文件的末尾。在此作用域内,全局变量可以为程序中各个函数所引用。有时需要用extern来声明外部变量,以扩展外部变量的作用域。
1、在一个文件内声明外部变量
如果外部变量不在文件的开头定义,其有效范围只限于定义处到文件结束。如果在定义点之前的函数想要引用该外部变量,则应该在应用之前用 关键字extern对该变量作“外部变量声明”,表明该变量是一个已经定义的外部变量。有了此声明,就可以从“声明”处起,合法地使用该外部变量。例如:

#include<stdio.h>
void main()
{
int max(int,int);
extern A,B;//外部变量声明;
printf(“%d\n”,max(A,B));
}
int A=13,B=-8;//定义外部变量
int max(int x,int y)//定义函数
{
int z;
z=x>y?x:y;
return(z);
}

用extern声明外部变量时,类型名可以省略,也可以写。
2、在多文件的程序中声明外部变量
一个C程序可以有一个或者多个源程序文件组成。如果一个程序包含两个文件,在这两个文件中都要用到同一个外部变量Num,不能分别在两个文件中各自定义一个外部变量Num,否则在进行程序连接时会出现“重复定义”的错误。正确的做法:在任一个文件中定义外部变量Num,而在另一个文件中用extern对Num作“外部变量声明”。即“extern Num”。在编译与连接时,系统会有此知道Num是一个已经在别处定义的外部变量,并将在另一个文件中定义的外部变量的作用域扩展到本文件,在本文件中可以合法地引用外部变量Num。
//文件file1.c中的内容
#include<stdio.h>
int A;//定义外部变量
void main()
{
int power(int);
int b=3,c,m;
printf(“enter the number a and its power m :\n”);
scanf(“%d,%d”,&A,&m);
c=Ab;
printf("%d
%d",A,b,c);
}

//以下为file2.c中的内容:
extern A;//声明A为一个已定义的外部变量,声明完成后本文件内可以使用;
int power(int n)
{
int i,y=1;
for(i=1;i<=n;i++)
{
y *=A;
}
return(y);
}

extern声明的外部变量扩展的到本文件使用,它的定义在其他地方,注意声明与定义的区别。下面的内部函数与外部函数也是一样。
二、内部函数与外部函数
函数本质上是全局的,因为一个函数要被另一个函数调用,但是也可以指定函数不能被其他文件调用。根据能否被其他文件调用,将函数区分为内部函数与外部函数。
1、内部函数
如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,函数名和函数类型的前面加上static。内部函数也称静态函数,因为它的声明用static使用内部函数只局限于所在文件。通常把只能由同一文件使用的函数和外部变量放在一个文件中,在它们的前面都冠以static使之局部化,其他文件不能使用。
2、外部函数
(1)在定义函数时,如果在函数的首部的最左端加上关键字extern,则表示此函数是外部函数,可供其他文件调用。如函数首部可以这样写
extern int fun(int a,int b);
这样,函数fun就可以为其他文件调用。C语言规定,如果在定义函数时省略extern,则隐含为外部函数。
(2)在需要调用此函数的文件中,用extern对函数声明,表示该函数是在其他文件中定义的外部函数。
//file1.c
void main()
{
extern void enter_string(char str[]);
extern void delete_string(char str[],char ch);//两个外部函数,它们的定义在其他文件中;
char c;
char str[80];
enter_string(str);
scanf(“%c”,&c);
delete_string(str,c);
}
//file2.c
#include<stdio.h>
void enter_string(char str[80])//定义外部函数
{
gets(str);
}
//file3.c
#include<stdio.h>
void delete_string(char str[],char ch)
{
int i,j;
for(i=j=0;str[i]!=‘\0’;i++)
if(str[i]!=ch)
str[j++]=str[i];
str[j]=‘\0’;
}

程序中2个函数都定义为外部函数。在main函数中用extern声明在main函数中用到enter_string,delete_string是在其他文件中定义的外部函数。

三、extern的理解
理解extern关键在于是extern是声明而不是在定义,其变量和函数的定义别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 声明可以多次,定义只能一次。 函数的声明extern关键词是可有可无的,因为函数本身不加修饰的话就是extern的。但是引用的时候一样是需要声明的。 而全局变量在外部使用声明时,extern关键词是必须的,如果变量无extern修饰且没有显式的初始化,同样成为变量的定义,因此此时必须加extern,而编译器在此标记存储空间在执行时加载如内存并初始化为0。而局部变量的声明不能有extern的修饰,且局部变量在运行时才在堆栈部分分配内存。
extern的使用最常见的用法就是在声明文件即头文件(.h)与定义文件即(.c/.cpp),我们在头文件(.h)中用extern声明某个变量或者函数为外部变量或者函数,在.cpp/.c文件中定义函数或者变量。然后我们在其他文件或者工程中使用该.cpp/.c文件中定义的函数或者变量时,只需#include<该头文件>即可。因为你在头文件中用extern声明的某个变量或者函数,将在本工程或者函数中预编译时展开该头文件。也即相当于实现了本工程或者本文件的自己声明extern某变量或者函数。
它这种用法关键在于extern实现声明,而不是定义。定义在另一个文件中。
四、extern "C"的理解
1、 C++保留了一部分过程式语言的特点,因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的不同。

2、 extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。
比如说你用C 开发了一个DLL 库,为了能够让C ++语言也能够调用你的DLL输出(Export)的函数,你需要用extern "C"来强制编译器不要修改你的函数名。
3、 extern “C” 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。
被extern "C"限定的函数或变量是extern类型的;

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值