const在C和C++中的区别

来源:互联网 发布:java程序设计教程答案 编辑:程序博客网 时间:2024/05/16 11:07

Thinking   in   CPP(version   2)的chapter8   Constants

 

C++

    当你只在定义该const   常量的文件中使用该常量时,c++不给你的const常量分配空间----这也是c++的一种优化措施,没有必要浪费内存空间来存储一个常量,此时const   int   c=0;相当于#define   c   0;   
    
    当在当前文件之外使用时,c++会给你的const分配空间(它是迫不得已)。因为若此时如果不分配空间,则obj中根本就不会有该常量的信息。连接的时候就找不到该常量。同样如果你在程序中取了常量的地址,也回迫使c++给你的常量分配空间。

 

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

  1.  //***a.cpp*** 
  2. #include <iostream> 
  3. extern const int i1; 
  4. extern const int i2 = 1; 
  5. const int i3 = 1;    // 不分配空间
  6. void main () 
  7.     const int i4 = 1;    // 分配空间
  8.     //int buf[i1];     // error 此处i1因为外链被当作变量。会编译出错
  9.     int buf0[i2];    // 此处i2被当作常量内联
  10.     buf0[0] = i1;    // 此处i1因为外链被当作变量赋值
  11.     buf0[0] = i2;    // 此处i2被当作常量内联赋值
  12.     buf0[0] = i3;    // 此处i3被当作常量内联赋值
  13.     buf0[0] = i4;    // 此处i4被当作常量内联赋值
  14.     std::cout << i1; 
  15. //***b.cpp*** 
  16. extern const int i 1= 1; // 外链,分配空间,去掉extern会链接出错,编译期分配空间,若不分配空间obj不会有该变量信息

C

始终外链,始终分配空间。

  1. //***a.c*** 
  2. #include <stdio.h>
  3. extern const int i;
  4. void main () 
  5. {
  6.  printf("%d/n",i);
  7. //***b.c*** 
  8. const int i = 1;