编译单元

编译分为两个步骤:

第一步:将每个.cpp或.c和相应的.h文件编译乘obj文件(包含预编译,汇编、编译)

第二部:将obj文件进行Link,生成最终的可执行文件

根据该阶段错误大致可分为两类:

一个,编译时的错误,大多为语法错误

一个,链接时错误,主要是变量、函数定义错误

编译单元指在编译阶段生成的每个obj文件

一个obj文件就是一个编译单元

一个.cpp或.c和它相应的.h文件共同组成了一个编译单元

一个由很多编译单元组成,每个obj文件里包含了变量存储的相对地址等

声明和定义

函数或变量在声明时,并不给它分配实际的物理内存空间,他有时候可以保证程序编译通过

函数或变量在定义时,它就在内存中有了实际的物理空间

如果在编译单元中引用的外部变量没有在整个工程中任何一个地方定义的话,那么即使它在编译时可以通过,链接时也会报错,因为程序内存中找不到这个变量

函数可以声明多次,但是只能定义一次

extern作用

作用1,当与“C”一起使用时,如 extern "C" void fun(int a, int b),则编译器中fun这个函数名按照c语言规则命名,而不是用c++规定命名。故C++中可以利用该法则调用c函数

作用2,当他不与“C"在一起修饰变量或者函数时,如在头文件中,extern int g_Num;其作用就是声明函数或者变量的作用范围的关键字,其声明的函数和变量可以在本编译单元或者其他编译单元使用

即b编译单元要引用A编译的单元的全局变量或者函数时,b编译单元只要包含a编译单元的头文件即可,在编译阶段,b编译单元虽然找不到该函数或变量,但是不会报错,他会在链接时从A编译单元的目标文件中找到该定义

全局变量(extern)

有两个类都需要使用共同的变量,这种变量就定义为全局变量。一般在头文件中声明,在cpp中定义,定义只能出现一次

静态全局变量(static)

使用static修饰的变量,不能用extern修饰。

static修饰的全局变量的声明与定义同时进行,即当你在头文件中是使用static声明了全局变量,同时也别定义了,

static修饰的全局变量的作用域只能是本身的编译单元内,不同编译单元的同名全局静态变量是没有关联的,占用的物理空间也是完全独立的

全局静态变量一般定义在.cpp中

全局常量(const)

const单独使用时,其特性与static一样(每个编译单元中地址都不一样,不过因为是常量,也不能修改,所以就没有多大关系)

const与extern一起使用时,其特性与extern一样,但不能修改

C++全局变量的定义和声明的更多相关文章

  1. C语言全局变量的定义与声明

    C语言中全局变量的定义与声明困扰着许多C语言初学者.本文讲述了全局变量定义与声明的用法,而且本为也将阐述这种用法的内在原理.我们先从两个错误例子引入,以下两个例程都在vc6.0平台上测试. 两种错误例 ...

  2. 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法

    一.关于全局变量的定义.声明.引用: (只要是在.h文件中定义的变量,然后在main.c中包含该.h文件,那么定义的变量就可以在main函数中作为全局变量使用) 方法1: 在某个c文件里定义全局变量后 ...

  3. keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法

    以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则几千行,这种方式无疑会带来N多麻烦,相信大家都有所体验吧! 后来学会了在keil里进行模块化编程,即只把功能相同或 ...

  4. QT中全局变量的定义

    多的就不说了,本来就是一个简单地内容,只是不会的话会很头疼 我们首先新建两个文件,文件名可以自定义,我们在这里定义为variate.h 和 variate.cpp 当然了,后缀是不能变的. 和函数一样 ...

  5. 定义与声明、头文件与extern总结

     用#include可以包含其他头文件中变量.函数的声明,为什么还要extern关键字? 如果我想引用一个全局变量或函数a,我只要直接在源文件中包含#include<xxx.h> (xxx ...

  6. sql 简单的定义变量 声明 输出

    --定义变量 声明 变量名 数据类型 varchar默认长度为1 --char 当字符不够时 用空格代替 declare @a char(10) --字符串用单引号 set @a ='abcdef' ...

  7. 定义与声明、头文件与extern总结(转)

    本文转自: http://lpy999.blog.163.com/blog/static/117372061201182051413310/ http://blog.csdn.net/feitianx ...

  8. 关于c++中的全局变量(不赋值的全局变量算定义)

    定义有三种: 1.不赋值的定义:int a; 2.赋值的定义:int a=5; 或者 int a;a=5; 3.加extern的定义:extern int a=5;//其实和不加是一样的. 声明只有一 ...

  9. C基础知识(2):变量&常量的定义和声明

    变量定义和声明 (1) 使用int,char等类型符定义变量 使用int,char等类型符定义变量时,不管有没有指定初始值,都就已经建立了存储空间(开辟内存).内存寻址由大到小,优先分配内存地址比较大 ...

随机推荐

  1. cmake 简单build和删除

    mkdir build cd build cmake .. make

  2. 剑指offer14:输入一个链表,输出该链表中倒数第k个结点。

    1. 题目描述 输入一个链表,输出该链表中倒数第k个结点. 2. 思路和方法 可以用两个指针,一个指针遍历到第k个结点的时候,第二个指针再走到第一个节点,然后两个指针的距离始终保持k-1.这样,当第一 ...

  3. P2279 消防局的设立 (树形DP or 贪心)

    (点击此处查看原题) 树形DP写法 看到这个题的要求,很容易相到这是一个树形DP的问题,但是dp数组应该如何设计并转移才是关键 dp[i][0]代表当前结点可以向上覆盖2层,自身一定被覆盖dp[i][ ...

  4. MCMF最大流最小割(模板)Dijkstra负权优化

    #define IOS ios_base::sync_with_stdio(0); cin.tie(0); #include <cstdio>//sprintf islower isupp ...

  5. 浅谈后缀数组SA

    这篇博客不打算讲多么详细,网上关于后缀数组的blog比我讲的好多了,这一篇博客我是为自己加深印象写的. 给你们分享了那么多,容我自私一回吧~ 参考资料:这位dalao的blog 一.关于求Suffix ...

  6. LeetCode 腾讯精选50题--求众数

    由于众数是指数组中相同元素的个数超过数组长度的一半,所以有两种思路,一. 先排序,后取排序后的数组的中间位置的值:二. 统计,设定一个变量统计相同元素出现的次数,遍历数组,若与选定的元素相同,统计变量 ...

  7. 解决chrome没有允许添加flash的问题

    有时候测试的时候,需要开启flash 但是Chrome一般都是自己弹出来的 现在弹不出来怎么办 自己添加? chrome://settings/content/flash 对不起  根本没有的 怎么解 ...

  8. IPhone中H5页面用on绑定click无效的解决方法

    首先声明本人资质尚浅,本文只用于个人总结.如有错误,欢迎指正.共同提高. --------------------------------------------------------------- ...

  9. Spark集群任务提交流程----2.1.0源码解析

    Spark的应用程序是通过spark-submit提交到Spark集群上运行的,那么spark-submit到底提交了什么,集群是怎样调度运行的,下面一一详解. 0. spark-submit提交任务 ...

  10. 发送短信——java

    闲来无事研究一下调用第三方接口发送短信的技术 这一次我们使用阿里的短信服务 一.进行平台相关服务的注册和设置 下面请参照阿里的短信服务文档进行设置,只要按照文档步骤来差不多30分钟就能搞定服务注册: ...