为什么用C语言中const常量定义数组大小会报错?

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43054397/article/details/90417740

1.为什么用C语言中const常量定义数组大小会报错?

在c语言编程中我们这样定义数组时编译器回报一个错误

const int maxn = 10;
int a[maxn];

//C程序报错
//error:variably modified 'a' at file scope

注: 这么写在C++中是可以的。

原因:

  • 常量只读变量 (不可变的变量)的区别:
    • 常量 肯定是只读的,例如数字6, 字符串“abc”等,肯定是只读的,因为程序中根本没有地方存放它的值,当然也就不能够去修改它。
    • 只读变量 则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。
    • C语言 规定数组定义时下标 必须是 常量只读变量 是不可以的
  • const
    • C语言中,const 就是用来限定一个变量不允许被改变的修饰符,即只读变量,因为占有存储空间,所以编译器不知道编译时的值,所以就不知道该给数组定义多大的。
    • C++ 中, const修饰的 可以看成是编译期的常量
      • 对于基本数据类型:编译器会把它放到符号表中,而不分配存储空间。
      • 对于ADT(Abstract Data Type 抽象数据类型)/ UDT(用户定义类型)的const对象则需要分配存储空间(大对象)。
      • 以及一些情况下也需要分配存储空间,例如强制声明为extern的符号常量或取符号常量的地址等操作。

注: 所以在C语言中我们定义常量的方法可以通过 #define 宏定义

2. C++定义常量时,是使用const,还是预处理宏 #define

  • 类型判断和安全检查
    • #define 在预处理阶段缺乏类型检测机制,所以不能正确地指定类型,就会导致一些错误
    • #define 预处理宏的全局并不是语义上的全局,之所以叫预处理宏,是因为预处理宏会在编译器编译代码之前被简单地替换成代码。然后,正因为预处理宏会被简单替换,所以替换的结果是不可预料的。
    • const 常量有具体的类型,在编译阶段会执行类型检查。
  • #define 预处理宏是全局 的。所以在 C++ 这样如此强调命名空间、类这样的东西的语言中,全局的东西最好是越少越好。
  • 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量 #define进行调试。
  • 以及上面提到的,编译器通常不为普通基本数据类型的 const 常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,就没有了存储与读内存的操作,所以 const 既可以节省空间,又能避免不必要的内存分配,所以使得它的效率很高。

注:所以更建议使用 const

这部分比较复杂,也查了很多资料,这里就简单总结了一下,更详尽的大家可以参考这些12

猜你喜欢

转载自blog.csdn.net/weixin_43054397/article/details/90417740