首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在C++中使用其他文件中的函数时,全局变量的正向声明需要外部变量,而函数不需要外部变量

在C++中,当我们想要在一个文件中使用另一个文件中定义的函数时,我们需要进行函数的声明。这是因为C++编译器是按照从上到下的顺序进行编译的,它需要提前知道函数的存在以便正确地解析和编译代码。

然而,对于全局变量的情况,C++编译器在编译过程中会为全局变量分配内存空间,并且在整个程序的执行过程中都可以访问这些全局变量。因此,当我们在一个文件中使用另一个文件中定义的全局变量时,编译器需要知道这个全局变量的类型和名称,以便正确地分配内存空间。

为了实现这一点,我们需要在使用全局变量的文件中进行全局变量的正向声明。这个声明告诉编译器全局变量的存在,并且它将在其他文件中定义。这样,编译器就能够正确地分配内存空间,并且在程序执行时可以正确地访问这些全局变量。

需要注意的是,函数的声明不需要外部变量是因为函数的定义本身就包含了函数的参数和返回值类型信息,编译器可以根据函数的定义来正确地解析和编译代码。而全局变量的声明需要外部变量是因为全局变量的定义通常是在其他文件中进行的,编译器需要知道这个全局变量的类型和名称以便正确地分配内存空间。

总结起来,在C++中使用其他文件中的函数时,函数的声明不需要外部变量是因为函数的定义本身包含了足够的信息,而全局变量的正向声明需要外部变量是因为编译器需要知道全局变量的类型和名称以便正确地分配内存空间。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C 语言】指针间接赋值 ( 直接修改 和 间接修改 指针变量 值 | 函数 间接修改 指针变量 值 | 函数 间接修改 外部变量 原理 )

文章目录 一、直接修改 和 间接修改 指针变量 值 二、函数 间接修改 指针变量 值 三、函数 间接修改 外部变量 原理 一、直接修改 和 间接修改 指针变量 值 ---- 直接修改 指针变量...值 , 就是为其赋值一个地址值 , 使用 & 取地址符 , 将变量地址赋值给指针变量 , 或者使用 malloc 函数分配内存赋值给 指针变量 ; // 将变量地址赋值给一级指针 p...间接修改 指针变量 值 ---- 函数 间接修改 指针变量 值 , 将 指向一级指针 二级指针 变量 , 传递到 函数形参 , 函数 , 使用 * 符号 , 修改 二级指针...一级指针 变量 , 这个传入 一级指针 变量 , 其 生命周期 到函数结尾就结束了 , 跟函 数外部 一级指针 变量 没有任何关系 ; 如果 要修改 函数外部 变量 , 必须传入 指向该变量...三、函数 间接修改 外部变量 原理 ---- 如果要 修改 一级指针 值 , 必须 传入 指向 一级指针 二级指针 变量 才可以 , 传入一级指针变量 , 不能修改一级指针变量值 ; 这是因为

21.2K11

C++随记(八)---存储持续性、作用域和链接性

外部变量是定义在外部,因此对所有函数而言都是外部,即可以main( )函数前面或者头文件定义他们。 可以文件位于外部变量定义后面的任何函数使用它们。因此外部变量也被称为全局变量。...和students_name这两个变量main()函数外面定义,且未加限定符static,所以它们是外部变量,也就是全局变量,我File02.cpp需要用到这两个变量,所以使用引用声明,关键字...通常情况下,应使用局部变量,应在需要知晓才传递数据,不应不加区分地使用全局变量。...链接性为内部变量只能在其所属文件使用;但常规外部变量都具有外部链接性,即可以 其他文件使用,如情况A。...,比如计算累加数据sum可能只需要第一次初始化0就好,之后还要利用前面相加结果,就可使用static来避免第二次使用函数变量被初始化掉) 补充:函数和链接性 函数也具有链接性,C++不允许一个函数定义另一个函数

1K00
  • extern、定义和声明

    当然 如果你用函数是API已经封装好  比如使用MFC里open()打开文件或者文件函数 ,就不需要声明  直接定义就可以了。  ...全局变量外部使用声明时,extern关键词是必须,如果变量无extern修饰且没有显式初始化,同样成为变量定义,因此此时必须加extern,编译器在此标记存储空间执行时加载如内存并初始化为...全局变量函数本质上讲没有区别,函数名是指向函数二进制块开头处指针。全局变量函数外部声明变量函数名也函数外,因此函数也是全局使用,要形成一种风格。...如果你想在本源文件使用另一个源文件变量,就需要使用前用extern声明变量,或者文件中用extern声明变量; 对函数而言,如果你想在本源文件使用另一个源文件函数,就需要使用前用声明函数...总结 extern “C”        extern “C” 不但具有传统声明外部变量功能,还具有告知C++链接器使用C函数规范来链接功能。 还具有告知C++编译器使用C规范来命名功能。

    1.3K20

    硬钢百度面试!

    所以实现多态,当用基类操作派生类,析构防止只析构基类不析构派生类状况发生,要将基类析构函数声明为虚函数为什么构造函数不写为虚函数?...六、static作用(作用域限制) static 不考虑类情况 有时候希望某些全局变量或者函数文件中被使用不能被其他外部文件引用,这个时候可以全局变量前加一个static说明,这样不同的人编写不同变量或者函数不用担心重名问题...定义要分配空间,不能在类声明初始化,必须在类定义体外部初始化,初始化时不需要标示为static;可以被非static成员函数任意访问。...,就应该在引用之前使用extern关键字对该变量进行声明,之后该全局变量作用域就从声明处一直到文件结尾了 将某一个源文件全局变量作用域扩展到其他文件:一个C++项目很多情况是由多个源文件构成,...如果在一个文件想引用另一个文件已定义全局变量,比如现在两个文件都要使用到同一个全局变量int a,正确做法应该是:一个文件定义变量a,而在另一个文件使用extern int a;对该变量进行声明

    19220

    C++extern关键字知识点

    1 基本解释:extern可以置于变量或者函数前,以标示变量或者函数定义别的文件,提示编译器遇到此变量函数其他模块寻找其定义。此外extern也可用来进行链接指定。      ...第二,当extern不与"C"在一起修饰变量函数,如在头文件: extern int g_Int; 它作用就是声明函数全局变量作用范围关键字,其声明函数变量可以本模块活其他模块中使用...答案与分析:   C++语言在编译时候为了解决函数多态问题,会将函数名和参数联合起来生成一个中间函数名称,C语言则不会,因此会造成链接找不到对应函数情况,此时C函数需要用extern “C...test2.cpp中使用#include "test1.h",那么test1.h声明其他函数你也无法使用了,除非也用都用extern修饰,这样的话你光声明函数就要一大串,而且头文件作用就是要给外部提供接口使用...正是因为static有以上特性,所以一般定义static全局变量,都把它放在原文件不是头文件,这样就不会给其他模块造成不必要信息污染,同样记住这个原则吧!

    1K40

    extern关键字

    一般而言,C++全局变量作用范围仅限于当前文件,但同时C++也支持分离式编译,允许将程序分割为若干个文件被独立编译。于是就需要文件间共享数据,这里extern就发挥了作用。...变量定义指申请存储空间,并将其与变量名相关联,除此之外,还可以为变量指定初始值。程序变量可以声明多次,但只能定义一次。一般而言,定义就是声明。...extern用法  extern有3种用法,分别如下:非常量全局变量外部链接 最常见用法,当链接器一个全局变量声明前看到extern关键字,它会尝试在其他文件寻找这个变量定义。...i;}常量全局变量外部链接  常量全局变量默认是内部链接,所以想要在文件间传递常量全局变量需要在定义指明extern,如下所示://fileA.cppextern const int i = 1;...原因是,C++语言在编译时候为了解决函数多态问题,会将函数名和参数联合起来生成一个中间函数名称,C语言则不会,因此会造成链接无法找到对应函数情况,此时C函数需要用extern “C”进行链接指定

    2.5K30

    static关键字总结

    全局变量本身就是静态存储方式,将全局变量声明为static是为了将变量作用域限制本翻译单元(本源文件),使该全局变量不能被源程序其他翻译单元所引用。...普通全局变量使用extren声明可以拓展其作用域至其他翻译单元。    可以总结为:static改变了全局变量作用域,不改变变量存储位置与生命周期。  ...函数定义默认是外部,通过extren声明即可被其他文件引用,static声明函数作用域限制本翻译单元,成为内部函数。...避免了链接其他文件变量命名引起冲突。       2.对于c函数而言,static对函数进行了信息屏蔽,只给当前文件其他函数使用。...  类内部声明static成员函数类定义体外部进行定义无须重复指定static关键字。

    33430

    C语言关键字详解(二) 带你全面了解 static 关键字

    ,仅仅是选择时候把c++文件改成.h而已 .h:我们称之为头文件,一般包含函数声明变量声明,宏定义,头文件等内容(header) .c: 我们称之为源文件,一般包含函数实现,变量定义等...文件对其进行声明,最后main.c文件全局变量函数进行打印和调用,我们可以发现,这种做法是可行,也就是说:全局变量函数可以跨文件访问(这个结论解释下文static作用时会被用到)...文件范围修改变量函数,static关键字指定该变量函数具有内部链接(其名称声明文件外部不可见)。...2、static修饰全局变量 图一图二对比分析:我Add.c定义了一个全局变量g_val,因为全局变量具有外部链接属性,所以我只需要在test.c对g_val进行声明之后就可以正常使用了,但是当我用...3、static修饰函数 图一图二对比分析:这里和 static 修饰全局变量非常类似,我Add.c定义了一个Add函数,因为函数也具有外部链接属性,所以我只需要在test.c对Add函数进行声明之后就可以正常使用

    33300

    C语言头文件j解析

    二、 头文件组织原则 源文件实现变量函数定义,并指定链接范围。头文件书写外部需要使用全局变量函数声明及数据类型和宏定义。...但头文件内不应extern自定义类型(如结构体)全局变量,否则将迫使本不需要访问该变量文件包含自定义类型所在头文件[1]。 7)说明性头文件不需要有对应文件。...大型工程,原有头文件可能会被多个其他(源或头)文件包含,原有头文件添加新文件往往牵一发动全身。若头文件类型定义需要其他文件,可将其提出来单独形成一个全局头文件。...直接暴露全局变量是不安全外部用户未必完全理解这些变量含义。 4)设计和调用访问动态全局变量、静态全局变量、静态局部变量函数需要考虑重入问题。...通常在某个相关文件定义,然后文件中进行外部声明需要使用时包含相应文件即可。定义变量文件也应包含该头文件,以便编译器检查定义和声明一致性。

    2K88

    c语言全局变量和局部变量问题汇总

    3、全局变量可不能够定义可被多个.C文件包括文件里?为什么? 答:能够,不同C文件里以static形式来声明同名全局变量。...静态全局变量则限制了其作用域, 即仅仅在定义该变量文件内有效, 同一源程序其他文件里不能使用它。...它与全程变量差别是: 全程变量能够再说明为外部变量(extern), 被其他文件使用, 静态全程变量却不能再被说明为外部, 即仅仅能被所在文件使用。...extern extern称为外部变量。为了使变量除了定义它文件里能够使用外, 还要被其他文件使用。...静态全局变量则限制了其作用域, 即仅仅在定义该变量文件内有效, 同一源程序其他文件里不能使用它。

    85720

    C语言头文件组织与包含原则

    文件书写外部需要使用全局变量函数声明及数据类型和宏定义。 建议组织头文件内容遵循以下原则: 1)头文件划分原则:类型定义、宏定义尽量与函数声明相分离,分别位于不同文件。...但头文件内不应extern自定义类型(如结构体)全局变量,否则将迫使本不需要访问该变量文件包含自定义类型所在头文件[1]。 7)说明性头文件不需要有对应文件。...大型工程,原有头文件可能会被多个其他(源或头)文件包含,原有头文件添加新文件往往牵一发动全身。若头文件类型定义需要其他文件,可将其提出来单独形成一个全局头文件。...直接暴露全局变量是不安全外部用户未必完全理解这些变量含义。 4)设计和调用访问动态全局变量、静态全局变量、静态局部变量函数需要考虑重入问题。...通常在某个相关文件定义,然后文件中进行外部声明需要使用时包含相应文件即可。定义变量文件也应包含该头文件,以便编译器检查定义和声明一致性。

    5.2K32

    CCPPstatic用法:全局变量与局部变量

    另外,C++需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类封装性,即要求此成员隐藏在类内部,对外不可见,可将其定义为静态数据。...它也不能在头文件声明外部定义,因为那会造成多个使用该类文件,对其重复定义。...(2)可见性:static修饰全局变量函数,这个全局变量只能在本文件访问,不能在其它文件访问,即便是extern外部声明也不可以。这个函数也只能在本文件调用,不能被其他文件调用。...(4)全局变量和全局静态变量区别 1)全局变量是不显式用static修饰全局变量全局变量默认是有外部链接性,作用域是整个工程,一个文件内定义全局变量另一个文件,通过extern 全局变量声明...2)全局静态变量是显式用static修饰全局变量,作用域是声明变量所在文件其他文件使用extern声明也不能使用

    2K20

    EasyC++47,全局变量

    外部变量函数外部定义,因此对于所有的函数而言都是外部。因此外部变量也被称为全局变量。 关于外部变量C++当中有一个单定义规则:变量只能有一次定义。...这句话看起来有些难以理解,为了理解它,我们需要厘清C++当中两种变量声明。一种是定义声明简称为定义,它给变量分配存储空间。另外一种是引用声明,简称为声明,它不给变量分配存储空间。...可能到这里还是有些难以理解,其实extern是为了引入其他文件创建变量。如果我们不加extern,表示在当前文件当中创建一个全局变量加上了extern表示引入其他文件创建全局变量。...外部链接性全局变量虽然是整个程序都可使用,但跨文件使用时,需要手动使用extern声明。 没有通过extern声明其他文件全局变量也是无法使用。...创建了变量warning,file2当中声明了这个全局变量

    17710

    C++this指针,静态成员,友元函数友元类

    ---- 1. this指针 在上篇讲C++类,对象,封装,继承(派生),多态时候,this指针出现在成员函数,并使用->成员提取符操作成员变量。...全局变量和静态变量区别: 对于定义函数外面的变量被成为全局变量(或者叫外部变量),它作用域是整个工程,比如我A.cpp定义了一个全局变量 :int A; 那么如果我想在B.cpp中使用这个变量...,我就可以B.cpp中使用extern关键字来使用变量A :extern A; 静态变量包括静态全局变量和静态局部变量全局变量相比,静态全局变量作用域是定义它这个cpp文件,如果一个项目只有这一个...静态局部变量定义它函数里面起作用,与普通局部变量相比,当函数返回后,静态局部变量并不会消失,普通局部变量会消失。 静态变量全局变量未初始化,都会被设定为0,而其他变量值设定随机。...因为是需要友元来共享数据,那么大多数情况,友元函数都是有参数, 因为友元函数没有this指针,则参数要有三种情况: 要访问非static成员需要对象做参数; 要访问static成员或全局变量

    1.5K10

    最全C语言基础知识梳理总结

    (4)如果调用函数没有return语句,并不带回一个确定用户需要值,函数不是不带回值,只是不带回有用值,带回一个不确定值。(5)如不需要带回任何值,用void。...h文件是头文件所用后缀。 3、如果使用用户自己定义函数,而且该函数使用函数同一个文件,一般还应该在主调函数对被调用函数声明。...,一般不再必要不要使用,他程序全部执行过程占用存储单元,是函数通用性,使用全局变量会使程序清晰性降低。...有时希望某些局部变量只限于被本文件引用,不能被其他文件引用,这时就可以采用在定义外部变量外加一个static,这在程序模块化设计中加强了通用性。...Static来声明一个变量作用有二个,一个是声明对局部变量。则为该变量分配空间整个程序执行期间始终存在;一个是在对全局变量声明,该变量作用域仅限于本文件模块操作。

    2K40

    C++变量总结束 | 输出各种变量

    C++register寄存器变量 变量除了数据类型以外,还有3种属性:  存储类别,C++允许使用auto,static,register和extern4种存储类别。...extern int  number3;//声明一个已定义外部整型变量 从作用域角度分,有局部变量全局变量。...C++中一个函数一般由:声明部分、执行语句两部分组成,声明部分作用是对有关标识符属性进行说明,对于函数声明和定义区别是明显函数声明函数原型,函数定义是函数功能的确立。...对函数声明是可以放在声明部分函数定义显然不在函数声明部分范围内,它是一个文件 独立模块。 对变量而言,声明与定义关系稍微复杂一些。...声明部分出现变量有两种情况:一种是需要建立存储空间;另一种是不需要建立存储空间。 经典案例:C++输出各种变量

    2K2828

    C和C++混合编译,extern和extern C

    extern “C”惯用法:  (1) C++引用C语言中函数变量包含C语言头文件(假设为cExample.h),需进行以下处理:  extern "C" { #include...(2) C引用C++语言中函数或者变量C++文件需要加上extern “C”,但是C语言中不能直接引用声明了extern “C”该头文件,应该仅在C中将C++定义extern “C”函数声明为... extern "C" void Test(void) 则和C编译器一样为_Test。 主要用于C++代码调用C函数声明,或C++编译函数要在C调用。...第二,当extern不与"C"在一起修饰变量函数,如在头文件: extern int g_Int; 它作用就是声明函数全局变量作用范围关键字,其声明函数变量可以本模块活其他模块中使用...也就是说B模块(编译单元)要是引用模块(编译单元)A定义全局变量函数,它只要包含A模块文件即可,在编译阶段,模块B虽然找不到该函数变量,但它不会报错,它会在连接从模块A生成目标代码中找到此函数

    3.5K11

    静态变量与动态变量

    静态变量,全局动态变量都是静态存储 2)动态存储变量程序执行过程使用才分配存储单元,使用完毕立即释放 3)静态存储变量是一直存在动态存储变量则时而存在时而消失。...2.动态变量(一下简称变量) 2.1全局变量 1)在所有函数外部定义(包括主函数),定义之后所有函数都能使用,属于静态存储 2)作用域为整个项目,即最终编译成可执行文件所有文件均可以使用动态全局变量...外部文件可以通过extern关键字来声明另一个文件存在全局变量 3)生命周期为从程序运行到程序退出,即贯穿整个运行时间 4)无显式初始化时默认初始化值为0 看一个有关全局变量文件例子: main.cpp...var_a在所有文件中都共享,每个文件都可以访问它并修改它值 2.2局部变量 1)函数内部定义,属于动态存储,其他函数不能访问,外部文件也不能访问,否则会出现: 2)作用域为当前函数,从定义位置,...5个0呢,为什么不是0,1,2,3,4呢 这是因为函数fun定义了一个动态局部变量a,a同时又是静态全局变量,在这种情况下,作用域小掩盖作用域大,所以局部变量会掩盖全局变量

    1.4K40

    C++编译与链接(2)-浅谈内部链接与外部链接

    为什么有时会出现无法解析外部符号? 为什么有的内联函数定义需要写在头文件? 为什么对于模板,声明和定义都要写在一起?...我们知道C++声明和定义是可以分开 例如在vs,我们可以一个函数声明定义放在b.cppa.cpp只需再声明一下这个函数,就可以a.cpp中使用这个函数了 a.cpp void show()...那些编译单元(.cpp)能向其他编译单元(.cpp)展示,提供其定义,让其他编译单元(.cpp)使用函数变量就是外部链接,例如全局变量 而那些编译单元(.cpp)不能向其他编译单元(.cpp)...答:你可能在不同cpp重复定义了一个具有外部链接函数变量,链接器链接找到了多个一样函数变量定义 为什么有时会出现无法解析外部符号?...答:你可能只提供了函数变量声明,没有提供其定义,或者声明和定义函数原型不一致,链接器没有找到其定义在哪里,所以链接环节出现了无法解析外部符号错误 为什么有的内联函数定义需要写在头文件呢?

    3.9K110

    C++extern声明外部变量 | 使用extern输出

    C++外部变量 上一节有读者咨询extern是什么,这节主要用来解释一下externC++用法,外部变量函数外部定义,它作用域为从变量定义处开始,到本程序文件末尾。...在此作用域内,全局变量可以为本文件各个函数所引用。编译全局变量分配在静态存储区,有时需要用extern来声明全局变量,以扩展全局变量作用域。...C++文件声明全局变量  如果外部变量不在文件开头定义,其有效作用范围只限于定义处到文件终了。...C++文件程序声明外部变量 如果一个程序包含两个文件两个文件中都要用到同一个外部变量,不能分别在两个文件各自定义一个外部变量。...用extern扩展全局变量作用域,虽然能为C++编码带来方便,但应十分慎重,因为执行一个文件函数,可能会改变了该全局变量值,从而会影响到另一文件函数执行结果。

    2.6K2828
    领券