可能重复的问题:
为什么要使用#define定义常量?
C ++中宏和const之间的差异
C++-枚举vs.const vs.#define
使用#define
和const
创建常量的区别是什么?其中任何一种方法是否具有性能优势?自然地,我更喜欢使用const
,但如果#define
有适当的优势,我将考虑使用它。
可能重复的问题:
为什么要使用#define定义常量?
C ++中宏和const之间的差异
C++-枚举vs.const vs.#define
使用#define
和const
创建常量的区别是什么?其中任何一种方法是否具有性能优势?自然地,我更喜欢使用const
,但如果#define
有适当的优势,我将考虑使用它。
#define
指令是一个预处理器指令;在编译器看到代码之前,预处理器就将这些宏替换为它们的实际内容。可以把它看作是源代码自动搜索和替换。#define
创建一个可以被宏预处理器替换的实体,与常量有很大不同,因为根据你定义的内容,它可能会或者不会被视为常量。#define 的内容可以是任意复杂的,经典示例如下:
#define SQR(x) (x)*(x)
然后如果使用:
SQR(2+3*4)
那将被转换为:
(2+3*4)*(2+3*4)
#define
是文本替换,因此速度非常快。此外,它保证了常量性。缺点是它不是类型安全的。
另一方面,const
变量可能会或可能不会在代码中被替换为内联。您可以强制取消 const 属性,使其在内存中(尽管它可能最初就驻留在只读内存中,但无论哪种方式都会带来麻烦)。但是,它保证是类型安全的,因为它携带自己的类型。
我个人建议使用 const
来明确您的意图。
const
并不能阻止它的发生。 - Blindy#define
避免的。 - Mike Seymourconst
的方式,但是即使转换const
类型也应该消除您可以执行的任何内联。我不记得我在哪里读过它。 - BlindyDEFINE是预处理指令,例如#define x 5。编译器将获取该值并在程序中调用x的任何位置插入它,并生成目标文件。定义常量不会在符号表中创建符号条目。如果您想要调试程序,则找不到x。我认为应尽可能使用常量。
#define A B
告诉预处理器(编译器的一部分)在编译代码之前将 B
替换为 A
。你可以(虽然这是一个可怕的想法)做一些像 #define FALSE TRUE
的事情。
const 变量意味着一旦变量被设置,它就不能被更改,但它不会对预处理器做任何事情,并且受到变量的正常规则的约束。
const
值具有作用域。 - Fred Larsonconst
比#define
更可取 - 那么为什么几乎所有的C代码库都广泛使用#define
,例如在头文件中,而不是const
? - Corel