定义c/c++全局变量/常量几种方法的区别

本文详细探讨了C/C++中全局变量和常量的声明与定义的区别,包括extern、static和const的用法。通过示例说明了extern用于声明全局变量,允许在多个编译单元间共享;static限制全局变量的作用域,使其仅在当前编译单元可见;const修饰的全局常量具有静态存储,但可通过extern扩展其作用域。同时,文章还分析了const修饰的指针变量的不同情况。
摘要由CSDN通过智能技术生成

定义c/c++全局变量/常量几种方法的区别

在讨论全局变量之前我们先要明白几个基本的概念:

 1. 编译单元(模块):

     在ide开发工具大行其道的今天,对于编译的一些概念很多人已经不再清楚了,很多程序员最怕的就是处理连接错误(link error)  因为它不像编译错误那样可以给出你程序错误的具体位置,你常常对这种错误感到懊恼,但是如果你经常使用gcc,makefile等工具在linux或者嵌入式下做开发工作的话,那么你可能非常的理解编译与连接的区别!当在vc这样的开发工具上编写完代码,点击编译按钮准备生成exe文件时,vc其实做了两步工作,第一步,将每个.cpp(.c)和相应.h文件编译成obj文件;第二步,将工程中所有的obj文件进行link生成最终的.exe文件,那么错误就有可能在两个地方产生,一个是编译时的错误,这个主要是语法错误,另一个是连接错误,主要是重复定义变量等。我们所说的编译单元就是指在编译阶段生成的每个obj文件,一个obj文件就是一个编译单元,也就是说一个cpp(.c)和它相应的.h文件共同组成了一个编译单元,一个工程由很多个编译单元组成,每个obj文件里包含了变量存储的相对地址等 。

 2. 声明与定义的区别

     函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可以保证你的程序编译通过,但是当函数或变量定义的时候,它就在内存中有了实际的物理空间,如果你在编译模块中引用的外部变量没有在整个工程中任何一个地方定义的话, 那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量!你也可以这样理解,对同一个变量或函数的声明可以有多次,而定义只能有一次!

  

 3. extern的作用

     extern有两个作用,第一个 当它与" c" 一起连用时,如: extern " c"  void fun(int a  int b)  则告诉编译器在编译fun这个函数名时按着c的规则去翻译相应的函数名而不是c++的, c++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun abc_int_int#$也可能是别的,这要看编译器的" 脾气" 了(不同的编译器采用的方法不一样),为什么这么做呢,因为c++支持函数的重载啊,在这里不去过多的论述这个问题,如果你有兴趣可以去网上搜索,相信你可以得到满意的解释!

     当extern不与" c" 在一起修饰变量或函数时,如在头文件中: extern int g_int  它的作用就是声明函数或全局变量的作用范围的关键字,其声明的函数和变量可以在本模块活其他模块中使用,记住它是一个声明不是定义!也就是说b模块(编译单元)要是引用模块(编译单元)a中定义的全局变量或函数时,它只要包含a模块的头文件即可  在编译阶段,模块b虽然找不到该函数或变量,但它不会报错,它会在连接时从模块a生成的目标代码中找到此函数。

  

     如果你对以上几个概念已经非常明白的话,那么让我们一起来看以下几种全局变量/常量的使用区别:

  

 1. 用extern修饰的全局变量

     以上已经说了extern的作用,下面我们来举个例子 如: 

     在test1.h中有下列声明:

     #ifndef test1h

     #define test1h

     extern char g_str[]  // 声明全局变量g_str

     void fun1() 

     #endif

     在test1.cpp中

     #include " test1.h" 

     

     char g_str[

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值