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
- C/C++中怎么使用Const
- C中CONST的使用
- C中CONST的使用
- C中CONST的使用
- C中CONST的使用
- C中CONST的使用
- C中CONST的使用
- C中CONST的使用
- C中CONST的使用
- C中CONST的使用
- c中const的使用
- C中CONST的使用
- C中CONST的使用
- C中const的使用
- C语言中const的使用
- C语言中正确使用const
- C语言中const的使用
- 嵌入式C中const关键字的使用
- Ubuntu 10.04地址导航栏修改为显示路径 本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/20
- Hdu 1213How Many Tables 并查集
- 11G新特性之 Access Advisor
- TABLESPACE学习
- 百度试题
- C/C++中怎么使用Const
- adb 找不到设备
- SQL Server 2005 创建自动备份步骤
- Apache2.0过滤器开发
- list 集合
- 基于net的cms
- http://cs.rednet.cn/a/a.asp?B=24&ID=483603
- java中用jdom 如何读取xml文档
- iPhone Objective-C 判断对象的类型