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

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

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

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

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

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

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

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

相关·内容

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

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

21.3K11

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

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

1.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;对该变量进行声明

    19920

    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.6K30

    static关键字总结

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

    33730

    C语言头文件j解析

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

    2K88

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

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

    89420

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

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

    5.3K32

    CCPP中static的用法:全局变量与局部变量

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

    2.6K20

    EasyC++47,全局变量

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

    18110

    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.6K11

    静态变量与动态变量

    静态变量,全局动态变量都是静态存储 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.5K40

    C语言变量的作用域和类别-学习二十

    m; } image.png 建议: 不必要时不要使用全局变量,原因如下: 1.全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。...x : y; return(z); } image.png 在多文件的程序中声明外部变量,用extern将外部变量的作用域扩展到其他文件。.../声明A为一个已定义的外部变量 image.png static声明外部变量 在程序设计中,某些外部变量只限于被本文件引用而不能被其他文件引用。...内部函数 内部函数又被称为静态函数,它只能被定义它的文件中的其他函数调用,而不能被其他文件中的函数调用, 即内部函数的作用范围仅仅局限于本文件。...在需要调用此函数的文件中,用extern对函数作声明,表示该函数是在其他文件中定义的外部函数。 例子 有一个字符串,内有若干个字符,输入一个字符,要求程序将字符串中该字符删去。用外部函数实现。

    98910

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

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

    4K110

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

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

    2.7K2828
    领券