#define vs const global #define是一个预处理器指令,用于定义一个宏,它可以在代码中替换为特定的值或代码段。 const是一个关键字,用于定义一个常量,它表示该变量的值在程序执行期间是不可改变的。 global表示全局的,用于指定一个变量的作用域范围为整个程序,而不仅仅是某个特定的代码块或函数。
在这个例子中,var2
只是要被C预处理器替换的文本。在程序被编译之前,预处理器会解析源文件,并替换掉任何出现的"var2"(除了在注释或字符串字面量中的情况),替换文本在这个例子中是数字200
。它不会占用内存空间,因为编译器甚至不会看到"var2",它只会看到数值常量字面量"200"。
然而,var1
是一个不可修改的lvalue(即它实际存在于内存中)。当你使用关键字const
来限定变量定义时,编译器会在程序试图修改变量时报错。
使用宏定义如#define var2 200
确实有性能优势,主要体现在程序占用的内存较少(因为栈上的变量较少),程序的运行速度可能会稍微快一些(因为处理器不必总是从内存中加载值)。
然而,宏定义可能存在错误,并且除了在最需要性能的应用程序中,使用const
变量的保护措施通常超过了成本。尽管如此,现代编译器非常智能,可以对const
变量进行优化,进一步减小性能损耗。
谢谢,出于好奇,什么情况下会考虑使用except in the most performance-intense applications
?
除非在最需要性能的应用程序中,否则编译器不需要为var1
分配特定的内存位置。而像100和200这样的整数字面量必须被放置在某个地方,如果它们被使用的话。所以本质上没有任何区别。
我对这个观点有异议:"它不会占用内存空间,因为编译器甚至不会看到"var2",它只会看到数值常量字面量"200"。" 这个常量肯定会占用内存,只是在程序的代码中而不是在栈等地方。
问题的出现原因是在C语言中,使用#define定义的宏常量和使用const关键字定义的全局常量之间存在一些区别。具体来说,下面是问题的解释和解决方法:
1. 宏常量的定义方式是使用#define预处理指令,它在编译阶段进行文本替换。这意味着,在编译过程中,宏常量并没有真正的内存地址,编译器只是将它替换为其对应的值。而全局常量使用const关键字定义,它在编译阶段会分配内存,并且有一个固定的地址。
2. 在运行时,宏常量和全局常量之间没有实质上的区别,因为它们的值都是固定的,并且编译器可能会将宏常量替换为其对应的值。
3. 但是在编译过程中,宏常量和全局常量之间存在一些区别。例如,宏常量可以在编译器要求常量的地方使用,比如case标签或数组大小的定义,而全局常量不能。这可能在一些情况下需要考虑。
4. 此外,如果使用整数字面值,不管它们是否有名称,都必须在某个地方存储。这取决于整数的大小和机器架构是否可行和有益。而不是取决于常量是否有名称。
对于解决这个问题,可以使用以下方法:
1. 如果要声明一个整数常量,可以使用static const关键字来定义全局常量,这样它就不会具有外部链接。在C++中,这样的定义允许在编译时使用它作为常量。
总结起来,宏常量和全局常量之间的差异在于编译阶段的处理方式和在编译器要求常量的地方能否使用。为了解决这个问题,可以使用static const关键字来定义全局常量,以便在编译时使用。