变量定义的注意事项

原创 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文件引用到。

 

 

 

 

关于c语言变量定义的注意事项

在标准C中规定变量定义必须放在所有的执行语句之前!一旦在运行语句之间再有定义的话,会报错误!见以下式例:#include #include int main() { char char1=A; p...
  • jindan_jinming
  • jindan_jinming
  • 2009年07月13日 22:30
  • 1640

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

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

Python_变量声明

Python 与大多数其它语言一样有局部变量和全局变量之分,但是它没有明显的变量声明。变量通过首次赋值产生,当超出作用范围时自动消亡。 Python 不允许引用一个未被赋值的变量,否则会引发一个异常...
  • mikyz
  • mikyz
  • 2017年04月06日 17:37
  • 1065

servlet 变量定义注意事项

-->此处定义的变量经测试 有时候会发现有缓存的情况  public void doPost(HttpServletRequest request,HttpServletResponse respo...
  • battlein
  • battlein
  • 2014年03月09日 10:24
  • 385

定义属性变量的注意事项

之前做一个广告图片浏览类DetailImageView,在默认的情况下写死了 UIViewContentMode类型为 UIViewContentModeScaleAspectFit ,在外部定义了一...
  • leixinag_1986
  • leixinag_1986
  • 2015年02月16日 16:19
  • 158

java基础第一章_变量以及使用变量注意事项

变量 变量: 在程序执行过程中其值可以发生改变的量。 注意事项: 1-作用域:    我们都知道变量在一个大括号的作用域里,那么这个变量就在这个大括号里有效。    而且在同一个作用域里不能定义两个...
  • lcn_Lynn
  • lcn_Lynn
  • 2017年05月17日 22:19
  • 315

使用变量的一般注意事项

看完代码大全第11章『使用变量的一般事项』,我想根据我们目前最容易遇到的以及对于我们目前最需要重视的方面,提炼出一些书中的精华。在这经典之上再进行浓缩一下。 先说一点知识:数据认知要想创建有效数据,那...
  • AndyNikolas
  • AndyNikolas
  • 2017年02月12日 16:36
  • 886

java面试题六 float变量合法声明

3
  • jianfpeng241241
  • jianfpeng241241
  • 2015年09月21日 00:20
  • 1791

Java使用变量的注意事项

/* 使用变量的注意事项: A:作用域 变量定义在那个大括号内,它就在这个大括号内有效。 并且,在同一个大括号内不能同时定义同名...
  • qq_27492735
  • qq_27492735
  • 2017年10月28日 14:02
  • 59

变量的定义和声明的区别详解

感言:我马上大三了,对计算机也算是有点感兴趣,但一直以来我对变量的定义和声明都很模糊,最开始看书上是这样讲的:定义-->就形如 int a;这就是定义了一个整形变量,然后就说变量的定义只能是一次而声明...
  • zhou753099943
  • zhou753099943
  • 2015年08月31日 14:39
  • 2835
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:变量定义的注意事项
举报原因:
原因补充:

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