有人问了关于const和#define之间的区别——它们是否“占用内存”,以及哪种“更安全”。这是我的回答。
确实,#define“不占用任何内存”。但除此之外,两者const和#define都有其安全和不安全的方面。
正如你所指出的,const“占用内存并具有类型检查的好处”。
还有其他几个区别
#define纯粹在编译时操作。实际上,由于它是预处理器指令,你可以认为它是在主编译器开始实际编译你的代码 *之前* 操作的。当你写
#define NUM1 45 int array[NUM1];
时,主编译器开始实际编译你的代码时,它看到的是
int array[45];这个例子也说明了#define的一个轻微的“不安全”方面。如果你不小心写成
#define NUM1 45; int array[NUM1];
编译器实际看到的是
int array[45;];这是一个语法错误。
当你写
const int num2 = 45;另一方面,主编译器会分配一个变量,类型为int,并将其初始化为值 45,并向自己做个标记,如果在源文件中的任何其他地方尝试修改此变量,它都会报错。
变量num2确实会占用内存。这意味着你可以创建一个指向num2的指针,有时这很重要。
通常我们不担心const变量会“占用”内存,而#define则不会。通常我们只谈论几个或几十个变量,无论如何都不会消耗大量内存。
在 C 中,const变量唯一的关键缺点是不能在需要真正的编译时常量的情况下使用它们。你不能说
int array2[num2];或
switch(var) { case num2:
你不能声明一个静态或全局变量并用 num2 的值对其进行初始化。
总而言之,我们有
#define:
const:
可能还有一两个我忘记的其他区别。
还值得注意的是,const在 C 和 C++ 中的行为不同。在 C++ 中,const变量*可以*用于编译时常量表达式,并且(据我理解)如果它们不需要,它们在运行时不会占用空间。