【C++】02 extern


link :有好些例子可以参考。
(此文中的定义(Defintition)和许多处说的“初始化”是一码事哈。)

1.声明和定义的区别

(Declaration and Definition)
​ ①声明只是告诉程序它的存在,并不分配内存给它,当一个 变量 或 函数 被定义的时候,系统就会给它分配内存
​ ②一个 变量 或 函数 可以被声明多次,但是它只能被定义一次
​ ③“extern”可以理解为“外部声明”。

2.函数 和 “extern”

​ 当我们写

int foo(int arg1, char arg2);

​ 此时,编译器视作:

extern int foo(int arg1, char arg2);

​ 也就是说,即使不添加关键字“extern”,默认情况会隐式假定了“extern”。这个函数也可以被整个工程文件的所有文件读取,和添加了“extern”的函数一样。只要其他文件声明了该函数,那么它就可以使用它(因为有了函数的声明,编译器就知道函数的定义所存在的位置了)。

3.变量 和“extern”

​ 首先,我们声明而不定义一个变量:

extern int var;

​ 此时,我们extern声明了一个变量,目前没有被定义。它仅仅是告诉编译器它会在别处被定义。因此,它也没有被分配内存。所以,我们可以多次这样声明这个变量。
​ 不过,如果我们写作:

int var

​ 此时,这个 变量 被同时声明和定义了,也就是说,它已经被分配了内存空间了。在这个例子中,尽管你没有给 var 赋值,但是你仍然可以输出 var

​ 和函数一样的是,当它被冠以“extern”的关键字时,它可以在整个项目中使用,只要我们在用的时候把它声明和定义出来就可以了。

注意:只有被分配了内存的变量和函数可以赋值和操作,否则会报错。

4.extern 用于多文件

somefile.h:

extern int global_x;
void print_global_x();

test.cpp:

#include "header.h"
int global_x;//重新的声明并定义了,也就是有分配内存了

int main(){
    global_x = 5;
    print_global_x();
}

void print_global_x(){
    std::cout << global_x << std::endl;
}

​ 用 extern 已经声明的变量,它还没有被分配内存,只有当在查找 包含的“somefile.h”中找到 var 的定义的时候,才会被分配内存。也就是说,没有包含“somefile.h”的话,便不可以赋值操作,因为这个 extern 声明 并不赋予内存。

5.extern和const的结合运用

​ 对于 const 变量,其具有默认具有内部链接。如果您希望变量具有外部链接,请将 extern 关键字应用于定义以及其他文件中的所有其他声明

//Source 1 :
extern const int global = 255; //a definition of global const variable in C++

//Source 2 :
extern const int global; //declaration

以下是错误的方式:

Source 1 :
const int global = 255; //wrong way to make a definition of global const variable in C++

Source 2 :
extern const int global; //declaration

6.总结

  1. 声明可以重复许多次,定义不可以。
  2. 关键字“extern”主要用于延展 变量 或 函数 到整个工程文件。
  3. 在函数中,即使不用关键字“extern”,也会隐式的使用它的功能。
  4. 当一个 变量 使用“extern”的时候,它只会被声明儿不会被定义。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值