#define 和 float 之间有什么区别?

5
这样做和这样做有什么区别呢?
#define NUMBER 10

并且

float number = 10;

在什么情况下应该使用一个而不是另一个?
3个回答

14
#define NUMBER 10

将创建一个字符串替换,该替换将由预处理器执行(即在编译期间执行)。

float number = 10;

这会在您的二进制数据段中创建一个浮点数,并将其初始化为10。也就是说,它将具有地址并且可变。

因此,编写以下代码:

float a = NUMBER;

这将等同于编写

float a = 10;

相比之下,撰写

float a = number;

将创建一个内存访问。


还需注意的是,将 float a = 10; (或其他变量)放在头文件中很可能会导致链接时出现重复符号错误。但使用 #define 则不会出错。 - trojanfoe

4
正如Philipp所说,#define形式会在编译前的预处理阶段在您的代码中创建替换。由于#define不像变量number一样,您的定义在编译时已经被硬编码到可执行文件中。如果您要表示的东西是一个真正的常数,在运行时不需要计算或从某个地方读取,并且在运行时不会更改,则这是可取的。 #define非常有用,可以使您的代码更易读。假设您正在进行物理计算--而不仅仅是将0.98f放入您需要使用重力加速度常数的每个代码中,您只需在一个地方定义它即可增加代码的可读性:
#define GRAV_CONSTANT 0.98f

...

float finalVelocity = beginVelocity + GRAV_CONSTANT * time;

编辑 回来后很惊讶看到我的答案,发现我没有提到为什么不应该使用#define

通常情况下,您应避免使用#define并使用实际类型的常量,因为#define没有作用域,而类型对IDE和编译器都有好处。

另请参阅此问题和已接受的答案:如何在Objective-C中创建常量?


0
"

#Define

是一个预处理器宏,它在程序启动之前运行,并且对整个程序有效。"
"

Float

是在程序/块内定义的数据类型,仅在程序/块内有效。"

1
“before the program starts” 意味着在编译之前。 - Matthias Bauch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接