Objective-C中静态const和#define之间的区别

时间:2012-10-20 17:11:03

标签: objective-c static const c-preprocessor

  

可能重复:
  “static const” vs “#define” in C

在Objective-C中,以下两行之间有什么区别:

#define myInteger 5

static const NSInteger myInteger = 5;

假设它们位于实现指令上方的MyClass.m中。

4 个答案:

答案 0 :(得分:14)

#define myInteger 5

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

static const NSInteger myInteger = 5;

这是一个常量的“真实”变量(声明后不能更改)。静态意味着它将是对该块的多次调用的共享变量。

答案 1 :(得分:2)

使用#define时,在将代码转换为二进制代码之前,编译器会将指定值替换为标识符。这意味着编译器在编译应用程序时进行替换。

当你使用const并运行应用程序时,会为常量分配内存,并在运行应用程序时替换值。

请参阅此链接: - Difference between static const and #define

答案 2 :(得分:2)

存在差异:

  1. 定义是文本替换:

    • 定义是在编译之前进行的预处理器文本替换。当您在每次出现的定义中以文本方式替换5时,您将获得相同的效果。
  2. 静态const是内存中的变量

    • 静态const是一个驻留在程序存储器中的NSInteger类型的实例。您无法在运行时更改它,但它是一个存在于内存中的值,它自己的地址作为变量。

答案 3 :(得分:1)

#define myInteger 5是一个声明常量的宏。

因此,只要您使用myInteger宏,它就会被预处理器引擎替换为5。

const NSInteger myInteger = 5;声明一个保存值为5的变量myInteger。

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