#Define VS Variable

Rrj*_*jji 8 c variables c-preprocessor

我无法理解有什么区别:

#define WIDTH 10 
Run Code Online (Sandbox Code Playgroud)

int width = 10;
Run Code Online (Sandbox Code Playgroud)

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

Alo*_*ave 8

两个有什么区别?

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

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

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

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

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

const int width = 10;
Run Code Online (Sandbox Code Playgroud)

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

基于范围的机制:

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


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

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


易于调试:

同样出于#2中提到的相同原因,虽然调试#define实际上没有提供任何帮助.


Vla*_*lad 7

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

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