打印
[技术问答]

全局变量的声明与定义的详解

[复制链接]
503|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
claretttt|  楼主 | 2024-7-23 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
(1)编译单元(模块)
在VC或VS上编写完代码,点击编译按钮准备生成exe文件时,编译器做了两步工作:
第一步,将每个.cpp(.c)和相应的.h文件编译成obj文件;
第二步,将工程中所有的obj文件进行LINK,生成最终.exe文件。
那么,错误可能在两个地方产生:
一个,编译时的错误,这个主要是语法错误;
一个,链接时的错误,主要是重复定义变量等。
编译单元指在编译阶段生成的每个obj文件。
一个obj文件就是一个编译单元。
一个.cpp(.c)和它相应的.h文件共同组成了一个编译单元。
一个工程由很多编译单元组成,每个obj文件里包含了变量存储的相对地址等。
(2)声明与定义
函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可保证你的程序编译通过;
函数或变量在定义时,它就在内存中有了实际的物理空间。

如果你在编译单元中引用的外部变量没有在整个工程中任何一个地方定义的话,那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量。
函数或变量可以声明多次,但定义只能有一次。
(3) extern作用
作用一:当它与"C"一起连用时,如extern "C" void fun(int a, int b);,则编译器在编译fun这个函数名时按C的规则去翻译相应的函数名而不是C++的。
作用二:当它不与"C"在一起修饰变量或函数时,如在头文件中,extern int g_nNum;,它的作用就是声明函数或变量的作用范围的关键字,其声明的函数和变量可以在本编译单元或其他编译单元中使用。
即B编译单元要引用A编译单元中定义的全局变量或函数时,B编译单元只要包含A编译单元的头文件即可,在编译阶段,B编译单元虽然找不到该函数或变量,但它不会报错,它会在链接时从A编译单元生成的目标代码中找到此函数。

使用特权

评论回复
沙发
合同圣诞节fy| | 2024-7-25 14:26 | 只看该作者
编译时的错误,这个主要是语法错误;

使用特权

评论回复
板凳
1988020566| | 2024-8-4 09:22 | 只看该作者
静态全局变量使用static关键字定义,它表示这个全局变量只属于当前源文件。即使在其他源文件中有同样名字的静态全局变量,它们也会被认为是完全不同的变量。

使用特权

评论回复
地板
yeates333| | 2024-8-4 10:33 | 只看该作者
全局变量可以使程序的各个部分相互依赖,降低代码的模块化和可维护性。因此,在可能的情况下,应优先考虑使用局部变量或参数传递来共享数据。

使用特权

评论回复
5
jkl21| | 2024-8-4 11:13 | 只看该作者
避免过度使用全局变量,因为它们可能导致程序难以理解和维护,也可能引起意外的副作用。

使用特权

评论回复
6
bestwell| | 2024-8-4 12:59 | 只看该作者
全局变量是在函数之外定义的变量,它们可以在程序的任何函数中使用。全局变量的作用域从定义的地方开始,直到文件的末尾。

使用特权

评论回复
7
mnynt121| | 2024-8-4 14:45 | 只看该作者
如果你不希望全局变量被其他编译单元访问,可以使用static关键字将其链接属性设置为内部的。

使用特权

评论回复
8
juliestephen| | 2024-8-4 16:26 | 只看该作者
全局变量可以在声明时进行初始化,若未显式初始化,则会被自动初始化为0。

使用特权

评论回复
9
fengm| | 2024-8-5 10:48 | 只看该作者
全局变量的声明是在函数外部进行的

使用特权

评论回复
10
ulystronglll| | 2024-8-5 13:40 | 只看该作者
全局常量在定义后不可更改,使用const关键字声明。它们可以在头文件中直接定义,因为const对象不会被分配可写的存储空间,而是以常量值的方式内联到使用它的代码中。这种特性让全局常量无需extern声明就可以在多个文件中安全使用。

使用特权

评论回复
11
wwppd| | 2024-8-5 15:35 | 只看该作者
声明一个全局变量通常是为了告诉编译器这个变量存在,并且指定其类型,但不分配存储空间。声明通常出现在头文件(.h文件)中,以便在多个源文件中共享。

使用特权

评论回复
12
maqianqu| | 2024-8-5 17:28 | 只看该作者
定义全局变量不仅声明了变量的存在和类型,还分配了存储空间,并且通常会初始化变量。定义通常出现在源文件(.c文件)中。

使用特权

评论回复
13
abotomson| | 2024-8-5 19:19 | 只看该作者
对全局变量的声明与定义的理解是程序设计的基础之一。正确使用全局变量能够提高代码的重用性和模块间的通信效率,但滥用则可能导致代码结构混乱和不必要的依赖。

使用特权

评论回复
14
sanfuzi| | 2024-8-5 21:57 | 只看该作者
全局变量在程序开始时被初始化,而局部变量在每次函数调用时都会被重新初始化

使用特权

评论回复
15
qiufengsd| | 2024-8-6 11:11 | 只看该作者
使用extern关键字。
不初始化变量。
可以重复声明多次,但必须在定义之前至少声明一次。

使用特权

评论回复
16
biechedan| | 2024-8-6 12:51 | 只看该作者
全局变量的声明和定义通常是一体的,即在定义的同时也完成了声明。全局变量的定义通常位于所有函数的外部,以便在整个程序中都可以访问。

使用特权

评论回复
17
modesty3jonah| | 2024-8-6 14:45 | 只看该作者
在C语言中,extern关键字用于声明一个全局变量,它指示该变量在别的编译单元中已经定义。这意味着,当一个源文件想要访问另一个源文件中定义的全局变量时,它需要使用extern关键字来声明这个变量。这样一来,编译器在遇到这个extern声明时就知晓该变量的定义在其他地方,会在链接阶段解决这个引用。

使用特权

评论回复
18
loutin| | 2024-8-6 16:23 | 只看该作者
全局变量的声明是在编译单元中引入一个已定义的全局变量的声明,而其定义实际上分配了存储空间并可选地初始化该变量。全局变量在多个编译单元或文件之间共享,因此它们必须在一个文件中定义,并在其他需要使用它们的文件中声明。

使用特权

评论回复
19
uytyu| | 2024-8-6 18:41 | 只看该作者
全局变量默认具有extern链接属性,除非它们被声明为static。static全局变量只在定义它们的文件内可见。

使用特权

评论回复
20
timfordlare| | 2024-8-6 20:20 | 只看该作者
声明全局变量时,可以省略初始化值,此时变量的初始值是不确定的。建议为全局变量显式指定一个初始化值。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

33

主题

1264

帖子

0

粉丝