extern声明变量或函数
1:C++编程思想 42页
定义变量
int a;
这段代码有足够的信息让编译器为a分配空间,而且编译器也确实给整数a分配了空间。
声明变量
extern int a;
在变量定义前加extern关键字表示声明一个变量但不定义它 。它表示"这只是一个声明,它的定义在别的地方",关键字extern,它表示变量是在文件以外定义的,或在文件后面部分才定义.
声明函数
C/C++的函数声明就是给函数取名,指定函数的参数类型和返回值.例如
int func1(int, int);
第一个关键字是函数返回值类型:int .参数按其使用的顺序依次排在函数后面的括号内.分号说明声明结束,在这种情况下,它告诉编译器"就这些,这里没有函数定义."
在函数声明时,可以给参数命名(形参)。编译器会忽略这些参数名,但对程序员来说它们可以帮助记忆.例如:
int func1(int length, int width);
对于带空参数列表的函数,C和C++有很大的不同.在C语言中,声明
int func2();
表示"一个可带任意参数(任意数目,任意类型)的函数".这就妨碍了类型检查.而在C++语言中它就意味着"不带参数的函数".
定义函数
函数定义看起来像函数声明,但它还有函数体.函数体是一个用大括号括起来的语句集.大括号表示这段代码的开始和结束.为了定义函数体为空(函数体不含代码)函数func1(),应当写为:
int func1(int length, int width) {}
extern也可用于函数声明.例如:
extern int func1(innt length, int width);
这种声明方式和先前的func1()声明方式一样。因为没有函数体,编译器必定把它作为声明而不是函数定义。extern关键字对函数来说是多余的,可选的。C语言的设计者并不要求函数的声明使用extern,这可能有些令人遗憾;如果函数声明也要求使用extern,那么在形式上与变量声明更加一致,从而减少了混乱。
2:C++精髓:软件工程方法
在其他的语言中,声明与定义是同义词C++与C一样,认为两者之间有一些区别。定义使变量的名字对应了指定类型,并为变量分配了相应的存储空间,而声明只是使变量的名字与类型之间建立了对应关系,因为变量的存储空间在其他地方分配。例如,这种情况发生在一个由多文件组成的程序中,
在一个文件中定义了变量,而在另一个文件中使用了该变量。在使用这个变量的文件中,使用了关键字extern将变量定义为外部变量:
extern int count;
现在,我们可以在这个文件的源代码中使用变量count。在这个文件中所有对变量count的引用都会转换为在另一个文件中定义的变量的count的地址.
另外一个定义和声明之间的区别是,变量在程序中只能进行唯一的一次定义,而声明的次数可以任意多次。例如:
不允许这样进行重复定义int a; int a;
但是可以这样声明 extern int count; extern int count;
229页.
函数的定义在一个程序中只能出现一次,但可以有多个函数原型。函数原型通常放在一个单独的工程目录的头文件中。这些文件在调用这些函数的源文件中用#include宏指令导入。C++允许我们在函数原型中不给出形式参数的命名。的确,参数名只有在函数的定义中才会用到。
void PutValues(int, int);
对程序员定义的函数而言,使用参数名可以为参数的作用提供帮助性的提示。
一些程序员并不在客户代码文件的开头处声明函数原形,而是在要调用函数的客户函数中作为文档的辅助手段进行声明。这可以清楚地告诉维护人员,就是这个函数(而不是同一个文件中的其他许多函数)使用了服务器函数。这是一个很重要的软件工程论题.例如:
void Client(void) {
//声明本方法中要使用的函数,这个技巧很重要
void PutValues(int value, int count);
int val;
int cnt;
count << "Please enter the value and its count: ";
cin >> val >> cnt;
//调用服务器函数
PutValues(val, cnt);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库