【问题标题】:Difference between static const and #define in Objective-C [duplicate]Objective-C中静态常量和#define之间的区别[重复]
【发布时间】:2012-10-11 01:02:40
【问题描述】:

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

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

#define myInteger 5

static const NSInteger myInteger = 5;

假设它们在 MyClass.m 中的 implementation 指令之上。

【问题讨论】:

标签: objective-c static constants c-preprocessor


【解决方案1】:
#define myInteger 5

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

static const NSInteger myInteger = 5;

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

【讨论】:

    【解决方案2】:

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

    所以无论你在哪里使用myInteger 宏,它都会被预处理器引擎替换为 5。

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

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

    【讨论】:

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

    有区别:

    1. 定义为文本替换:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-08-11
        • 1970-01-01
        • 1970-01-01
        • 2012-08-25
        • 1970-01-01
        • 1970-01-01
        • 2018-12-22
        • 1970-01-01
        • 2021-08-27
        相关资源
        最近更新 更多