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
对象只是:一个对象或符号,但它不一定对应于“内存分配”-可能没有实际分配的内存,因为它可能是内联的或以其他方式优化的。