C/C++中怎么使用Const

来源:互联网 发布:java 按钮活动监听器 编辑:程序博客网 时间:2024/05/13 12:09


C++中的Const

     当你只在定义该const  常量的文件中使用该常量时,c++不给你的const常量分配空间----这也是c++的一种优化措施,没有必要浪费内存空间来存储一个常量,此时const   int  c=0;相当于#define   c   0;  


    当在当前文件之外使用时,c++会给你的const分配空间(它是迫不得已)。因为若此时如果不分配空间,则obj中根本就不会有该常量的信息。连接的时候就找不到该常量。同样如果你在程序中取了常量的地址,也回迫使c++给你的常量分配空间。 


    C++编译器在通常情况下不为常量分配空间,而是将其值存放在符号表内.但当使用extern修饰常量时,则必须立即为此常量分配空间(与之类似的情况还有取常量的地址等等).之所以必须分配空间,是因为extern表示"使用外部链接",   这表明还会有其他的编译单元将会使用寻址的方法来引用它,因此它现在就必须拥有自己的地址.

 

也就是说:

   C++中,是否为const分配空间要看具体情况;
   如果加上关键字extern或者取const变量地址,则编译器就要为const分配存储空间.
   C++中定义常量的时候不再采用define,因为define只做简单的宏替换,并不提供类型检查.

 

例子见http://my.opera.com/yeqiwei/blog/show.dml/501390

            http://blog.csdn.net/pocketmatrix/archive/2008/11/01/3198095.aspx

 

 

C中的Const

  问题:const变量& 常量

  为什么我象下面的例子一样用一个const变量来初始化数组,ANSIC的编译器会报告一个错误呢?

  const int n = 5;

  int a[n]; 

  答案与分析:

  1)、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, “abc”,等,肯定是只读的,因为程序中根本没有地方存放它的值,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSIC规定数组定义时维度必须是“常量”,“只读变量”也是不可以的。

  2)、注意:在ANSIC中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是ANSIC对数组的规定限制了它。

  3)、那么,在ANSIC 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。 

 

Const : C Vs. C++的例子

C++中的const正常情况下是看成编译期的常量,编译器并不为const分配空间,只是在编译的时候将期值保存在名字表中,并在适当的时候折合在代码中.所以,以下代码:

#include
using namespace std;
int main()
{
   const int a = 1;
   const int b = 2;
   int array[ a + b ] = {0};
   for (int i = 0; i < sizeof array / sizeof *array; i++)
   {
      cout << array << endl;
   }
}

在可以通过编译,并且正常运行.但稍加修改后,放在C编译器中,便会出现错误:

#include
int main()
{
int i;
const int a = 1;
const int b = 2;
int array[ a + b ] = {0};
for (i = 0; i < sizeof array / sizeof *array; i++)
{
printf("%d",array);
}
}

错误消息:
c:\test1\te.c(8): error C2057: 应输入常数表达式
c:\test1\te.c(8): error C2466: 不能分配常数大小为 0 的数组
出现这种情况的原因是:
在C中,const是一个不能被改变的普通变量,既然是变量,就要占用存储空间,所以编译器不知道编译时的值.而且,数组定义时的下标必须为常量.




const int size;
在C语言中,这个语句在是正确的,因为它被C编译器看作一个声明,指明在别的地方分配存储空间.

但在C++中这样写是不正确的.C++中const默认是内部连接,如果想在C++中达到以上的效果,必须要用extern关键字.


C++中,const默认使用内部连接.而C中使用外部连接.
内连接:编译器只对正被编译的文件创建存储空间,别的文件可以使用相同的表示符或全局变量.

   C/C++中内连接使用static关键字指定.
外连接:所有被编译过的文件创建一片单独存储空间.一旦空间被创建,连接器必须解决对这片存储空间的引用.

   全局变量和函数使用外部连接.

   通过extern关键字声明,可以从其他文件访问相应的变量和函数.




REFERENCE:

Const用法大汇总http://blog.csdn.net/zhanglonghua/archive/2010/02/28/5334329.aspx

原创粉丝点击