关于C的一些变量关系的杂谈 (编译 作用域 extern)

命名空间标识一个符号 编译是文件内的编译 运行时一整个程序的运行 每个符号都不能重复

声明一个符号:告诉编译器有这个符号

  普通声明:

    符号定义在文件中

  extern声明:

    extern a;

    符号定义在文件外,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。

    extern:

      在定义的时候,这个extern居然可以被省略。 

      extern int a;//声明一个全局变量a

      int a; //定义一个全局变量a,定义一个可以被外部使用的全局变量。

      

      // 有初始化的就是定义

      extern int a =0 ;  // 定义一个全局变量a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间。

      int a =0;//定义一个全局变量a,并给初值,和上面是一个意思

定义一个符号

现代编译器都是文件内编译,链接后整个程序才融为一体。

现代编译器一般采用按文件编译的方式,因此在编译时,各个文件中定义的全局变量是互相不透明的。也就是说,在编译时,全局变量的可见域限制在文件内部。

这就是说,在编译阶段,各个文件中定义的全局变量相互是不透明的,编译A时觉察不到B中也定义了i,同样,编译B时觉察不到A中也定义了i。

但是到了链接阶段,要将各个文件的内容“合为一体”,因此,如果某些文件中定义的全局变量名相同的话,在这个时候就会出现错误,也就是上面提示的重复定义的错误。

因此,各个文件中定义的全局变量名不可相同。

在链接阶段,各个文件的内容(实际是编译产生的obj文件)是被合并到一起的,因而,定义于某文件内的全局变量,在链接完成后,它的可见范围被扩大到了整个程序。

这样一来,按道理说,一个文件中定义的全局变量,可以在整个程序的任何地方被使用,举例说,如果A文件中定义了某全局变量,那么B文件中应可以使用该变量。修改我们的程序,加以验证:

http://baike.baidu.com/link?url=blIQJ71gnHAvj3EC9Ip-SsOdMTyHX5Sft5p43ijifPUiH-eBLluRrrokfq3pyslrvXB98F72-eyZsNLnFR_Y1q

时间: 2024-10-27 03:20:56

关于C的一些变量关系的杂谈 (编译 作用域 extern)的相关文章

JAVA之旅(六)——单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖

JAVA之旅(六)--单例设计模式,继承extends,聚集关系,子父类变量关系,super,覆盖 java也越来越深入了,大家加油吧!咱们一步步来 一.单例设计模式 什么是设计模式? JAVA当中有23种设计模式,解决某一问题最有效的方法 单例设计模式 解决一个类在内存中只存在一个对象 想要保证对象唯一该怎么做> 1.为了避免其他程序过多建立该类对象,先禁止其他程序建立该类对象 2.还为了让其他程序访问到该类对象,只好在本类中自定义一个对象 3.为了方便其他程序对自定义对象的访问,可以对外提供

2.Python入门-计算机组成、指令和程序、标识符、变量、数据类型、对象和变量关系、运算符

一.计算机的组成 计算机由两部分组成:硬件 和 软件 硬件包含:键盘.鼠标.显示器.CPU.主板.内存.硬盘 ... -硬件是看的见摸得着的 软件包含:系统软件(windows.macOS.Linux)和应用软件(office .QQ.绝地求生) -软件是看的见摸不着的,软件负责控制计算机中的硬件 二.指令和程序 计算机的硬件系统通常由五大部件构成,包括:运算器.控制器.存储器.输入设备和输出设备. 中央处理器:运算器和控制器,它的功能是执行各种运算和控制指令以及处理计算机软件中的数据. 程序实

变量在函数内外的作用域 2

function fn() { echo "inside the function, \$var = ".$var."<br>"; $var = "content 2"; echo "inside the function, \$var = ".$var."<br>"; } $var = "content 1"; fn(); echo "outside

变量存储类型(auto static extern)

auto 动态存储类型变量(函数内部变量存储默认为 auto型) auto只用于函数内部定义,单片机在执行这个函数时为它分配内存地址,当函数执行完毕返回后,auto变量会被销毁,再次进入这个函数时,它的初值是不确定的,必须对她重新进行初始化.auto变量是局部变量,只允许在定义它的函数内部使用,在函数外的其他地方都不能使用.由于auto变量在定义它的函数以外的任何地方都是不可见的,所以允许在这个函数以外的其他地方或是其他函数内部定义同名的变量,它们之间是不会发生冲突的,因为他们都有自己的区域性,

生命周期,作用域的定义;说明全局变量、静态变量、局部变量、const变量的生命周期、作用域

生命周期,作用域的定义:说明全局变量.静态变量.局部变量.const变量的生命周期.作用域: 生命周期:是一个变量存在的周期. 作用域:是一个变量可以被引用的范围.最常见的如:{}.static修饰符等等. 1)全局变量: 作用域:全局作用域(只需要在一个源文件中定义,就可以作用于所有的源文件): 生命周期:程序运行期一直存在: 引用方法:其他文件如果要使用,必须用extern 关键字声明要引用的全局变量: 内存分布:全局(静态存储区). 注意:如果再两个文件中都定义了相同名字的全局变量,则连接

Vim 中的变量赋值、引用与作用域

使用 let 进行变量赋值,echo 打印变量的值, unlet 销毁变量. 对于 Vim 选项还可用 set 来更方便地操作,比如 set {option}, set no{option}, set {option}?. 普通变量可以直接引用,环境变量要加前缀 $.寄存器变量要加前缀 @.Vim 选项要加前缀 &. 变量默认作用域取决于定义的位置,函数内则为函数作用域,外部则为全局变量. 赋值和引用变量时可以使用 b:,g:,l:,t: 等前缀来指定要操作哪个作用域的变量. 和其他编程语言一样

变量关系

1.如何区分私有变量和全局变量? 在全局作用域下声明(预解释的时候)的变量是全局变量: 在"私有作用域中声明的变量"和"函数的形参"都是私有的变量: 在私有作用域中,我们代码执行的时候遇到一个变量,首先我们需要确定它是否为私有的变量,如果是私有的变量,那么和外面没有任何的关系:如果不是,则往前作用域的上级作用域进行查找,如果上级也没有则继续查找,一直找到window为止.也就是作用域链. 2.当函数执行的时候(直接目的:让函数体中的代码执行),首先会形成一个新的私有

js中变量含(参数、数组)作用域传递问题

js没有块级作用域(你可以自己闭包或其他方法实现),只有函数级作用域和全局作用域,函数外面的变量函数里面可以找到使用,函数里面的变量外面无法访问到. 写这个是因为ES6中的一个例子开始的.首先看下例子 var a = []; for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 10 var a = []; for (let i = 0; i < 10; i++) { a[i] =

C++变量的存储类别与作用域

总结一下C++中变量的存储类别以及变量的作用域. (1)标示符的存储类别决定了标示符在内存中存在的时间(我们可以理解标示符就是确定一个变量的符号,也就是我们所说的变量名) 二:存储类别 (1)静态存储类别:静态存数类别变量(我们简称静态变量),从程序的开始处就存在,其生命期伴随整个程序. (2)自动存储类别:当变量时自动存储类别时,变量在进入到定义它们的程序快时定义它,在离开它们所在的程序块(作用域)时销毁它,因此成为自动变量.其中关键字auto和register用来声明自动类型的变量, 三:自