Objective-C中static const和#define的区别

7
在Objective-C中,以下两行代码有何区别:

可能是重复的问题:
“static const” vs “#define” in C

#define myInteger 5

static const NSInteger myInteger = 5;

假设它们在 MyClass.m 文件的实现指令之上。

3
在C语言中,静态常量可以使用两种方式定义:使用#define指令或者使用const关键字。这两种方式都可以用来创建不可修改的值,但是它们有些微小的差别。#define指令被预处理器用来执行文本替换。当代码中出现了一个#define指令定义的符号时,预处理器会将该符号替换为与之相关联的文本。由于#define仅仅是文本替换,因此在预处理器执行替换时无法进行任何类型检查。这意味着如果你使用#define来定义常量,并且在程序中错误地给它赋了一个新值,编译器不会给出警告,而程序也不会抛出异常;代码只会照常运行,但是常量的值已经被改变了。相比之下,const关键字在编译时对常量进行类型检查。如果你试图修改一个const常量的值,编译器将会抛出错误。这意味着使用const定义的常量更加安全,因为它们无法被意外地修改。另外,const常量通常会被放在内存的只读区域,这使得它们更加高效。因此,总的来说,使用const关键字定义常量更加安全和高效。 - bhb
4个回答

16
#define myInteger 5

#define myInteger 5是一个预处理器宏。在编译器启动之前,预处理器将替换每个出现的myInteger5。它不是一个变量,而是一种自动查找和替换的机制。

static const NSInteger myInteger = 5;

这是一个“真实”的常量变量(声明后无法更改)。Static 意味着它将成为多次调用该块的共享变量。


2
当使用 #define 时,编译器在将代码转换为二进制之前,会将标识符替换为指定的值。这意味着编译器会在编译应用程序时进行替换。
当您使用 const 并运行应用程序时,内存会为常量分配,并且该值在应用程序运行时被替换。
请参考此链接:static const 和 #define 的区别

2

以下是不同之处:

  1. define 是文本替换:

    • 在编译之前,预处理程序会进行文本替换。如果您在每个 define 出现的地方进行文本替换 5,您将获得相同的效果。
  2. 静态常量是内存中的变量

    • 而静态常量是 NSInteger 类型的实例,驻留在程序内存中。您不能在运行时更改它,但它作为一个值存在于内存中,并具有自己的地址作为变量。

1

#define myInteger 5 是一个宏定义,用于声明常量。

因此,无论在哪里使用 myInteger 宏,预处理器引擎都会将其替换为 5。

const NSInteger myInteger = 5; 声明了一个变量 myInteger,它保存值 5。

但是它们的使用方式相同,即它们都是常量,可用于防止硬编码。


它们在语义上并不相同。一个是编译器执行的文本查找和替换,而另一个是实时内存分配。 - deleted_user
错误的术语使用了...已更正。 - Lews Therin
@deleted_user - 你说得对,它们在语义上并不相同,但是const对象就是一个对象或符号,但它不一定对应于"内存分配" - 因为它可能会被内联或以其他方式进行优化而没有实际的内存分配。 - Mark Lakata

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接