使用类对象宏是定义全局变量的好方法吗?

Is using object-like macros a good way to define global variables?

我的老师告诉我预处理器命令 #define 是声明全局变量的方法。基本上我使用 object-like macros

#define x 3

声明x为全局变量。现在,我习惯于做类似的事情来定义这些类型的变量,我被建议不要再这样做了:

#include <stdio.h>

const int x = 3;

int main(void){...};

据我所知(考虑到我是 C 和一般编程的新手),如果我们谈论程序的工作原理,那么声明全局变量的两种方式实际上是相同的. 假设我有这样的代码:

y = x * 3;

此代码将编译并 运行 完全没有问题,同时使用 #define x 3const int x = 3;。现在,我肯定在这里遗漏了一些东西,但我真的看不出有什么不同!谁能温柔地告诉我这个问题的重点是什么?

#define 曾用于创建常量,而不是变量,但现在为此目的不受欢迎。 #define x 3 是一个预处理器指令,基本上意味着 "replace x with 3 everywhere in the source file"。这就像在打开 "match whole word" 和 "case-sensitive" 选项的代码编辑器中进行搜索和替换。

另一方面,

const 创建一个合法的标识符,其中包含地址和范围以及所有内容。它可以像变量一样使用,甚至可以使用 &(地址)运算符。就是不能赋值给。

对于这一小段代码,#define 和 Const 值没有区别。但是,如果您正在编写性能关键代码,请考虑#define,因为它使您的价值成为全球性的,它是编译器的 pre-processed 而 Const 具有正常查找。 优点是 #define 会自动替换每次出现的名称。 缺点是如果您在代码中多次使用相同的名称,它会发生冲突。