本质而言, 预处理指令不能被叫做常量, 它只是预处理阶段的字符串替换(也就是俗称的宏), 后面的值你跟一个常量值可, 跟一个变量值也可, 或者甚至也可跟一个表达式
也因此在 OC 中, 所以我们经常可以看到 #define 被用来生成一些自用的"语法糖", 常见的比如说如果你经常用 OC 的 block 特性, 那么应该见到过很常见的会把 __weak id
给包起来的#define "语法糖" (此处语法糖仅借用这个概念, 不是官方的语法)
另外举两个 #define "可能被修改"的例子:
- #define 后被 #undef
- #define 的值本身指向一个变量, 见这个例子
#include <stdio.h>
#define HELO (hello)
int main(int argc, char *argv[]) {
int hello = 1;
printf("%d
", HELO);
hello = 2;
printf("%d
", HELO);
return 0;
}
另外当然 define 也更容易产生冲突, 所以命名需要自己加以一些考虑(一般都用大写), 要避开操作系统和系统库的定义
总之, 还是要区分出明确的使用场景, 不要一概而论, 如果你明确只是要一个常量, 那么用 static const, 如果你明确需要一个预处理宏, 那么就用 define
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…