变量定义的注意事项

原创 2007年09月17日 17:44:00

                            变量定义的注意事项

我们在写代码的过程中经常会出现变量被重复定义了,我们就做一个小测试,看看这么避免这个问题,什么时候出错。

1.   普通变量重复定义

假设在有三个文件a.h, b.cpp, c.cpp.

//a.h

 int i = 123;

 

//b.cpp 

include “a.h”

 

//c.cpp

include “a.h”

这时候会出现重复定义错误,原因出自编译的时候,.h文件会被展开,两个.cpp文件会被变成

//b.cpp 

int i = 123;

 

//c.cpp

int i = 123;

 

错误出自链接时,发现定义了两个变量定义在全局数据区,显然重复定义。

 

如果没有a.h,只有两个cpp的话,可以通过下面的方式避免重复。

//b.cpp 

extern int i = 123;

 

//c.cpp

int i = 123;

         这样的话两个i是同一个变量。

有人说pragma once不就是用与解决重复定义的问题吗? 你可以试试看,结果还是错误。

这是因为我们没有弄清楚pragma once的真正用意,一知半解的时候就用了。

假设有两个文件a.h a.cpp

//a.h

 int i = 123;

 

//a.cpp 

include “a.h”

include “a.h”

 

如果a.cpp被引用两次的话,会出现重复定义的错误, 问题就是icpp被展开了两次。

这时候如果加上pragama once或者用预定义宏的话,就可以解决这个问题。

pragma once的主要用途是避免在同一个cpp文件中某一个.h文件被多次展开,特别是在间接引用的时候。

     关于我们提出来的第一个问题,我们解决办法之一就是把定义放到.cpp中,如果其他地方引用的话,就用extern方式。 对于普通变量extern 可以放在变量声明处,也可以放在定义处,也可以放在想引用地方,用于告诉编译器,我在程序数据区是唯一的,不要再重新定义一个兄弟了。

2.   关于const变量

根据前面的文章《c++const的完全解析》,我们知道它是放在符号表中的,

//a.h

const int i = 123;

 

//b.cpp 

include “a.h”

 

//c.cpp

include “a.h”

只维护一个在符号表中的变量,展开相当于

//b.cpp 

const int i = 123;

 

//c.cpp

extern const int i; //这里面有一个小问题我在下面会提到

所以就不会出现重复定义的问题。

 

但是如果const变量是定义在.cpp文件中的呢,我们都知道用extern就可以了,假设有两个文件a.cppb.cpp

//a.pp

const int i = 123;

 

//b.cpp 

extern const int i;

但是编译的时候会出错,如果在a.cpp中补一个extern就可以了,如下

//a.pp

extern  const int i = 123;

 

//b.cpp 

extern const int i;

 

3.   关于static变量

根据文章《C++Static的完全解析》,static变量是放在全局static数据区的。而且它有唯一性和长期性两个特性。

 

//a.h

static int i = 123;

 

//b.cpp 

include “a.h”

 

//c.cpp

include “a.h”

这样的用法也是正确的,不会出现重复定义现象。

 

如果static变量被定义到.cpp文件中,这时候改变量就活动范围就只是这个 cpp文件了,它不能通过extern被其它.cpp文件引用到。

 

 

 

 

相关文章推荐

不同内存空间(data xdata bdata)定义变量在51单片机编程中的注意事项

1、data区空间小,所以只有频繁用到或对运算速度要求很高的变量才放到data区内,比如for循环中的计数值。2、data区内最好放局部变量。因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退...
  • fanscky
  • fanscky
  • 2011年03月15日 10:59
  • 2372

Java 变量定义的时候注意事项

一、常量定义的基本注意事项。 在Java语言中,主要是利用final关键字(在Java类中灵活使用Static关键字)来定义常量。 当常量被设定后,一般情况下就不允许再进行更改。如可以利用如下...

Java 变量定义的时候注意事项

一、常量定义的基本注意事项。在Java语言中,主要是利用final关键字(在Java类中灵活使用Static关键字)来定义常量。当常量被设定后,一般情况下就不允许再进行更改。如可以利用如下的形式来定义...

【C++注意事项】2 变量声明和定义

不可能将所有的C++程序放到一个文件中咯,因此C++就支持了分离式编译(separate compilation)机制,它允许将程序分为若干个文件,每个文件可被独立编译。这样说明了,当你的程序有很多文...
  • NoMasp
  • NoMasp
  • 2015年05月20日 20:59
  • 1800

jsp自定义标签库注意事项

  • 2009年03月15日 01:23
  • 50KB
  • 下载

类中有指针成员变量时的一些注意事项

知识真的是知道的越多,不知道到的越多。本来只是想在自己写的string类中加个记录对象的静态成员变量,刚开始遇到了计数结果为负值的情况,后来知道了有复制构造函数这么一说。有因为类中声明了一个str的指...

linux中级进阶01--linux分区的注意事项,特殊目录,pwd,mkdir命令再次介绍以及执行文件路径的变量: PATH

说明: 这里的中级进阶只是相对的,在该系列中级进阶将只涵盖一些常用命令的进一步介绍,安装软件,脚本编程,简单的系统管理。         参考资料:鸟个的私房菜;youtube上的一些视屏教程。 ...

教你如何配置eclipse环境变量以及注意事项

主要是介绍eclipse环境变量的配置,以及注意事项!

awk中调用shell变量注意事项

awk中不能直接用$var来引用shell的变量,昨天写的shell脚本,有一列是不正确的,导致最后一列>50那处数据不正确,悲催的语法。有空再把质量统计数据加入到支撑平台吧。 #app...
  • fastwei
  • fastwei
  • 2011年11月06日 14:08
  • 190
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:变量定义的注意事项
举报原因:
原因补充:

(最多只允许输入30个字)