C语言中不可使用const常量定义数组大小,而C++是允许的

本文探讨了C语言与C++中使用const定义数组大小的区别。在C语言中,由于const变量在编译时无法确定其具体值,故不能用于定义数组大小,而C++则允许。预处理宏#define在C++中缺少类型检查,而const常量具备类型安全性。此外,C++中const常量默认为内连接,适合头文件定义,而C语言中const常量默认外连接,可能导致重复定义问题。因此,C++推荐使用const定义常量。
摘要由CSDN通过智能技术生成

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 既可以节省空间,又能避免不必要的内存分配,所以使得它的效率很高。

注:所以C++中更建议使用 const

3.C语言和C++中使用const定义常量的一个区别

  • 标准C语言中,const符号常量默认是外连接的(分配存储),也就是说你不能在两个(或两个以上)编译单元中同时定义一个同名的const符号常量(重复定义错误),或者把一个const符号常量定义放在一个头文件中而在多个编译单元中同时包含该头文件。
  • 但是在标准C++中,const符号常量默认是内连接的,因此可以定义在头文件中,当在不同的编译单元中同时包含该头文件时,编译器认为它们是不同的符号常量,因此每个编译单元独立编译时会分别为它们分配存储空间,而在连接时进行常量合并。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值