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
占用可执行文件中的空间并需要对内存的引用,但实际上这是无关紧要的,可能会被编译器优化掉.
const
s比#define
s 更加友好的编译器和调试器.在大多数情况下,这是在决定使用哪一个时应该考虑的最重要的一点.
想到你可以使用#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
.事实上,这几乎是苹果所做的.这具有#define
s和const
s的所有优点,但仅适用于整数常量.
// 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标准,它的官方未定义行为,则在运行时分配可能仍会失败.
就个人而言,对于整数常量,我总是使用enum
s作为其他类型的常量,我使用const
除非我有充分的理由不这样做.
Meg*_*rda 16
来自C编码器:
A const
只是一个其内容无法更改的变量.
#define name value
但是,它是一个预处理器命令,用于替换name
with的所有实例value
.
例如,如果您#define defTest 5
,编译时defTest
代码中的所有实例都将被替换5
.
小智 11
理解#define和const指令之间的区别非常重要,这些指令并不意味着相同的事情.
const
const
用于从被询问的类型生成一个对象,该对象在初始化后将是常量.这意味着它是程序存储器中的一个对象,可以作为readonly使用.每次启动程序时都会生成对象.
#define
#define
用于简化代码可读性和未来修改.使用define时,只掩盖名称后面的值.因此,使用矩形时,您可以使用相应的值定义宽度和高度.然后在代码中,它将更容易阅读,因为而不是数字将有名称.
如果以后您决定更改宽度值,则只需在定义中更改它,而不是在整个文件中更改无聊和危险的查找/替换.编译时,预处理器将使用代码中的值替换所有已定义的名称.因此,没有时间丢失使用它们.
归档时间: |
|
查看次数: |
80579 次 |
最近记录: |