#Define VS Variable

我无法理解有什么区别:

#define WIDTH 10 

 int width = 10; 

使用第一个或第二个有什么好处?

嗯,有很大的不同。 你可以改变width的值,你可以拿它的地址,你可以问它的大小等等。 使用WIDTH ,它将在任何地方被替换为常量10 ,因此表达式++WIDTH没有任何意义。 在另一方面,您可以使用WIDTH项声明一个数组,而不能声明具有width项的数组。

总结: WIDTH的值在编译时是已知的,不能更改。 编译器不为WIDTH分配内存。 相反, width是一个初始值为10的变量,它的其他值在编译时是未知的; 变量从编译器获取其内存。

两个有什么区别?

第一个是 ,第二个是变量声明。

#define WIDTH 10是一个预处理程序指令 ,允许您指定名称( WIDTH )及其替换文本( 10 )。 预处理器解析源文件,每次出现的名称都被其关联的文本替换。 编译器根本不会实际看到宏名称,它看到的是被替换的文本。

变量声明由编译器本身评估。 它告诉编译器声明一个名为widthint类型的变量,并使用值10初始化它。
编译器通过自己的名称width知道此变量。

你更喜欢哪一个? 为什么?

通常,建议在#define上使用编译时常量变量。 所以你的变量声明应该是:

 const int width = 10; 

#define选择编译时常量有很多原因,即:

基于范围的机制:

#define的范围仅限于定义它的文件。 因此,在一个源文件中创建的#defines在不同的源文件中不可用。 简而言之,#define不遵守范围。请注意, const变量可以作为范围。它们遵守所有范围规则。


在编译错误期间避免奇怪的魔法数字:

如果您正在使用#define ,那么在预编译时它们会被预处理器替换。因此,如果您在编译期间收到错误,它将会引起混淆,因为错误消息不会引用宏名称而是值,它将显示为突然值一个人会浪费很多时间在代码中跟踪它。


易于调试:

同样出于#2中提到的相同原因,调试时#define也没有提供任何帮助。

WIDTH是一个宏,它将被预处理器替换为值(10),而width是一个变量。

当你#define一个宏(比如这里的WIDTH)时,预处理器只会在程序传递给编译器之前进行文本替换 。 即,无论你在代码中使用WIDTH ,它都会被替换为10

但是当你执行int width=10 ,变量是活的

首先是简短的背景:在编译之前, 预处理 C文件。 预处理器检查#include#define语句。

在您的情况下,# #define语句告诉预处理器使用字符串10更改源代码中的每个字符串WIDTH 。 当文件在下一步中编译时, WIDTH每次出现实际上都是10 。 现在,区别

 #define WIDTH 10 

 int width = 10; 

是第一个可以看作是一个constant量值,而第二个是一个正常变量,其值可以改变。

一个#define由预处理器处理,如果在源代码中找到WIDTH并用10替换它,它所做的只是基本替换,其他int width = 10; 由编译器处理,这将在查找表中创建条目,生成二进制文件以在堆栈上分配足够的内存,具体取决于其定义的位置,并将值10复制到该内存位置。

所以一个只是一个常量的标签,另一个是运行时的变量。

您可以使用预处理器来加快执行速度,因为需要在堆栈上分配变量,代价是在运行时不可变。

您通常使用预处理器来处理在运行时不需要更改的事情,但是要小心预处理器调试可能有点棘手,因为它们实际上可以在源代码交给编译器之前操作源代码,从而导致非常微妙的错误,可能会或可能不会检查源代码。

定义就像一个静态的全局定义范围。 它不能被改变或覆盖为正常变量。