C++变量的声明、定义和extern关键字

马谦马谦马谦
马谦马谦马谦
马谦马谦马谦
606
文章
12
评论
2018年3月15日16:17:04 评论

一、变量的声明和定义

C++的分离编译机制允许程序拆分成多个文件来写,最常见的是在头文件中进行声明,源文件中进行定义,然后一起编译:

声明使得函数或者变量被程序所知,定义负责创建与声明相关联的实体。变量只能被定义一次,但能多次声明。

声明变量的两种方式:

  • 使用extern关键字且没有被显示初始化,如extern int i;
  • 不使用extern关键字且没有被显示初始化,如int i;

一旦一个变量被显示初始化了,该条语句就会被认为是定义,例如extern double pi = 3.14;

二、声明和定义的必要性

声明和定义在多个文件中比较重要,特别是对于在多个文件中都要使用的同一个变量,必须进行声明。

例如三个文件test.h, test1.cpptest2.cpp中都要使用同一个全局变量的情况:

main.cpp

编译运行,程序输出:

test.h中声明变量gCnt,另外的两个文件中分别引用头文件,并且其中一个定义gCnt。由于变量只能被定义一次,所以不能同时在test1.cpptest2.cpp中定义gCnt,否则会报错:

根据变量的默认初始化规则,test1.cpp中的全局变量gCnt会被默认初始化为0,就相当于执行了int gCnt=1;

值得注意的是,头文件中的extern关键字不能省,因为省略extern编译器会把它当作全局变量定义。然后被同时两个cpp文件包含,预处理阶段就会生成两个gCnt的定义,导致编译错误:

三、extern和static

extern和static

马谦马谦马谦
  • 本文由 发表于 2018年3月15日16:17:04
  • 转载请务必保留本文链接:https://www.dyxmq.cn/program/code/c-cpp/cpp-declaration-definition-extern.html
给socket分配随机端口 C/C++

给socket分配随机端口

客户端的socket不需要手动执行bind绑定地址,但这不意味着客户端socket真的不需要绑定端口,实际上是内核它帮我们做了这个操作,在执行connect时,内核发现没有绑定端口,就会自动选择一个合...
vector中emplace_back方法的用途 C/C++

vector中emplace_back方法的用途

在写代码的过程中,CLion提醒我把push_back方法替换成emplace_back方法: 代码中我的想法是使用vector创建一个二维数组,并提前分配好空间,避免后序频繁扩容增加时间复杂度。 e...
宏定义踩坑实战:嵌套调用宏定义 C/C++

宏定义踩坑实战:嵌套调用宏定义

问题背景:在刷题的过程中,要使用min函数,但是线上OJ并没有这个函数。因为一时也想不起它到底属于哪个头文件,所以为了偷懒,顺手就写下了以下宏定义: #define min(x, y) (x) <...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: