Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
284 views
in Technique[技术] by (71.8m points)

oc用#define定义了,还能被修改?

oc52方法书中第4节写的:
使用static const定义常量要优于使用#define预处理指令,因为编译器会确保常量值不变。而采用预处理指令所定义的常量可能会无意中遭人修改,从而导致应用程序各个部分所使用的值互不相同。

请问:
使用#define预处理指令,采用预处理指令所定义的常量可能会无意中遭人修改,从而导致应用程序各个部分所使用的值互不相同。

用#define定义了,还能被修改?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

本质而言, 预处理指令不能被叫做常量, 它只是预处理阶段的字符串替换(也就是俗称的宏), 后面的值你跟一个常量值可, 跟一个变量值也可, 或者甚至也可跟一个表达式

也因此在 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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share

2.1m questions

2.1m answers

62 comments

56.6k users

...