在Objective-C中#define vs const

Obj*_*der 81 const objective-c c-preprocessor

我是Objective-C的新手,我有一些关于const和预处理指令的问题#define.

首先,我发现无法使用定义常量的类型#define.这是为什么?

第二,使用其中一个比另一个更有优势吗?

最后,哪种方式更有效和/或更安全?

Jer*_*myP 106

首先,我发现使用#define无法定义常量的类型,为什么会这样?

为什么是这样的?这不是真的:

#define MY_INT_CONSTANT ((int) 12345)
Run Code Online (Sandbox Code Playgroud)

第二,使用其中一个比另一个更有优势吗?

是. #define定义一个甚至在编译开始之前被替换的宏. const仅修改变量,以便编译器在尝试更改时标记错误.有些情况你可以使用a #define但你不能使用a const(虽然我很难找到一个使用最新的clang).理论上,const占用可执行文件中的空间并需要对内存的引用,但实际上这是无关紧要的,可能会被编译器优化掉.

consts比#defines 更加友好的编译器和调试器.在大多数情况下,这是在决定使用哪一个时应该考虑的最重要的一点.

想到你可以使用#define但不能使用的环境const.如果你有一个常量,你想在大量的.c文件中使用,#define你只需将它贴在标题中即可.有了const你必须在C文件中有一个定义

// in a C file
const int MY_INT_CONST = 12345;

// in a header
extern const int MY_INT_CONST;
Run Code Online (Sandbox Code Playgroud)

在标题中. MY_INT_CONST不能用作任何C文件中静态或全局范围数组的大小,除了它定义的那个.

但是,对于整数常量,您可以使用enum.事实上,这几乎是苹果所做的.这具有#defines和consts的所有优点,但仅适用于整数常量.

// In a header
enum
{
    MY_INT_CONST = 12345,
};
Run Code Online (Sandbox Code Playgroud)

最后,哪种方式更有效和/或更安全?

#define在理论上更有效,尽管如我所说,现代编译器可能确保没有什么区别. #define更安全的是,尝试分配给它总是一个编译器错误

#define FOO 5

// ....

FOO = 6;   // Always a syntax error
Run Code Online (Sandbox Code Playgroud)

const虽然编译器可能会发出警告,但可以欺骗分配给s:

const int FOO = 5;

// ...

(int) FOO = 6;     // Can make this compile
Run Code Online (Sandbox Code Playgroud)

根据平台的不同,如果常量放在只读段中,并且根据C标准,它的官方未定义行为,则在运行时分配可能仍会失败.

就个人而言,对于整数常量,我总是使用enums作为其他类型的常量,我使用const除非我有充分的理由不这样做.


Meg*_*rda 16

来自C编码器:

A const只是一个其内容无法更改的变量.

#define name value但是,它是一个预处理器命令,用于替换namewith的所有实例value.

例如,如果您#define defTest 5,编译时defTest代码中的所有实例都将被替换5.


小智 11

理解#define和const指令之间的区别非常重要,这些指令并不意味着相同的事情.

const

const用于从被询问的类型生成一个对象,该对象在初始化后将是常量.这意味着它是程序存储器中的一个对象,可以作为readonly使用.每次启动程序时都会生成对象.

#define

#define用于简化代码可读性和未来修改.使用define时,只掩盖名称后面的值.因此,使用矩形时,您可以使用相应的值定义宽度和高度.然后在代码中,它将更容易阅读,因为而不是数字将有名称.

如果以后您决定更改宽度值,则只需在定义中更改它,而不是在整个文件中更改无聊和危险的查找/替换.编译时,预处理器将使用代码中的值替换所有已定义的名称.因此,没有时间丢失使用它们.


Ed *_*eal 7

除了其他人的评论之外,#define由于预处理器在编译器之前获取它们,因此使用的错误非常难以调试.