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

    xiaoxiao2021-04-15  336

    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

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


    最新回复(0)