#define和const有什么区别?

时间:2011-06-22 15:21:40

标签: c++ const c-preprocessor

  

可能重复:
  Why would someone use #define to define constants?
  difference between a macro and a const in c++
  C++ - enum vs. const vs. #define

使用#defineconst创建常量有什么区别?有没有比其他的性能优势?当然我更喜欢使用const,但如果它具有合适的优势,我会考虑#define

6 个答案:

答案 0 :(得分:71)

#define指令是预处理程序指令;在编译器甚至看到它之前,预处理器用它们的主体替换那些宏。可以将其视为自动搜索和替换源代码。

const变量声明在语言中声明一个实际变量,你可以使用......好吧,就像一个真正的变量:取其地址,传递它,使用它,转换它等等。

哦,性能:也许您认为避免变量的声明可以节省时间和空间,但是任何合理的编译器优化级别都没有区别,因为常量值已经在编译时被替换和折叠。但是你获得了类型检查的巨大优势,并使调试器知道你的代码,所以没有理由不使用const变量。

答案 1 :(得分:6)

#define创建一个由宏预处理器替换的实体,它与常量完全不同,因为根据您定义的内容,它将被视为常量还是不被视为常量。 #define的内容可以是任意复杂的,经典的例子是这样的:

#define SQR(x) (x)*(x)

然后如果使用:

SQR(2+3*4)

那会变成:

(2+3*4)*(2+3*4)

答案 2 :(得分:3)

不同之处在于#define由预处理器处理,其功能相当于简单的文本替换。像这样定义的Const值对于实际的编译器是不可见的,而用const修饰符定义的变量是实际类型的“变量”(实际上不是那个变量)。 #define的缺点是替换了每个名称的出现,而const变量得到了正常的查找,因此命名冲突的风险较小,而且不是类型安全的。

#define的优点是它保证了constness,因此没有后备变量。 Const变量可能会或可能不会被代入代码,因此在某些情况下#define可能会更快。然而,一个好的编译器应该内联那些consts并且它在大多数情况下不太可能产生很大的差异,所以我会继续使用const,除非你有一段代码,你已经看到编译器没有内联变量和它是非常非常非常高性能的代码。

答案 3 :(得分:1)

#define是文字替代品,因此速度最快。此外,它保证了常量。缺点是它不是类型安全的。

另一方面,const变量可能会或可能不会在代码中内联替换。你可以抛弃constness,迫使它在内存中(尽管它可能只存在于只读内存中,但无论哪种方式都令人头痛)。它保证是类型安全的,因为它带有它自己的类型。

我个人建议const明确你的意图。

答案 4 :(得分:0)

#define A B告诉预处理程序(编译器的一部分)在代码中看到B的任何地方的代理A,它在编译代码之前完成它。你可以(虽然这是一个可怕的想法)做#define FALSE TRUE

之类的事情

const变量意味着一旦设置了变量就无法更改它,但它不会对预处理器执行任何操作,并且受常规变量规则的约束。

答案 5 :(得分:0)

DEFINE是预处理程序指令,例如#define x 5.编译器接受此值,insert是在程序中调用x并生成目标文件的位置。定义常数deosn在符号表中创建符号条目。如果你想调试程序,你将找不到x。     尽可能使用常数,我认为。