Objective-C中静态常量和#定义之间的差异

Objective-C中静态常量和#定义之间的差异,objective-c,static,constants,c-preprocessor,Objective C,Static,Constants,C Preprocessor,可能重复: 在目标C中,以下两行之间的区别是什么: #define myInteger 5 static const NSInteger myInteger = 5; 假设它们位于实现指令上方的MyClass.m中。\define myInteger 5是一个声明常量的宏 因此,无论您在哪里使用myInteger宏,它都会被预处理器引擎替换为5 const NSInteger myInteger=5声明一个保存值5的变量myInteger 但是它们的用法是一样的,也就是说它们是可以用来防止

可能重复:

在目标C中,以下两行之间的区别是什么:

#define myInteger 5

static const NSInteger myInteger = 5;
假设它们位于实现指令上方的MyClass.m中。

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

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

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

但是它们的用法是一样的,也就是说它们是可以用来防止硬编码的常量

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

static const NSInteger myInteger = 5;
这是一个常量“实”变量(声明后不能更改)。静态意味着它将是对该块的多个调用中的共享变量。

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

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

请参阅此链接:-

存在差异:

  • 定义为文本替换:

    • Define是在编译之前进行的预处理器文本替换。如果每次出现define时都以文本形式替换5,则会达到相同的效果
  • 静态常量是内存中的一个变量

    • 然而,Static const是驻留在程序内存中的NSInteger类型的实例。您不能在运行时更改它,但它是内存中的一个值,并且它自己的地址是一个变量

  • 它们在语义上不一样。一个是由编译器完成的文本查找和替换,另一个是活生生的运行时内存分配。这里使用了错误的术语。。已更正。@deleted_user-你是对的,它们在语义上不相同,但
    const
    对象只是:一个对象或符号,但它不一定对应于“内存分配”-可能没有实际分配的内存,因为它可能是内联的或以其他方式优化的。