【问题标题】:Is using object-like macros a good way to define global variables?使用类对象宏是定义全局变量的好方法吗?
【发布时间】:2016-01-13 23:07:03
【问题描述】:

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

#define x 3

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

#include <stdio.h>

const int x = 3;

int main(void){...};

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

y = x * 3;

使用#define x 3 和const int x = 3;,这段代码将毫无问题地编译和运行。现在,我肯定在这里遗漏了一些东西,但我真的看不出有什么不同!谁能温和地告诉我这个问题的意义何在?

【问题讨论】:

  • #define x 3不创建全局变量。
  • @immibis 那么它的作用是什么?
  • 它定义了一个类似对象的宏。类对象宏不同于全局变量。

标签: c macros global-variables constants c-preprocessor


【解决方案1】:

#define 被用来创建一个常量,而不是一个变量,但现在它为此目的不受欢迎。 #define x 3 是一个预处理器指令,基本上意味着“将源文件中的任何地方的x 替换为3”。这就像在代码编辑器中使用“匹配整个单词”和“区分大小写”选项进行搜索和替换。

const,另一方面,创建一个合法的标识符,带有地址和范围以及所有内容。即使使用&amp;(地址)运算符,它也可以像变量一样使用。就是不能分配给它。

【讨论】:

  • 那么,这是否与代码的风格更相关?
  • @ClaudioCortese 想象一下在其他地方你有一个 for 循环:for(int x = 5; x &lt; 10; x++) printf("%d\n", x); 猜猜如果你使用 #define 会发生什么?
  • 不仅如此。假设我写了#define x rand()。在我的代码中使用x 的任何地方,它都会被rand() 替换并产生一个新的随机数。如果我改用const int x = rand(),它只会计算一次rand(),每次我使用x,我都会得到相同的数字。
  • @immibis 你是对的,但是你可以通过简单的方式避免这个错误,因此这不是一个真正的问题
  • @ClaudioCortese 有什么简单的方法?
【解决方案2】:

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

【讨论】:

  • 这种“查找”将被任何比完全可怕的编译器优化掉。
  • 也许这就是为什么我的老师说这是声明全局变量的最佳方式
  • @JohnSensebe 等等,我错过了什么吗?使用 const int 是否比 #define 更优化?
  • 不,但是一个不错的编译器将使const 与#define 一样高效。曾经有人说const 速度较慢,因为答案中的原因,但今天很少出现这种情况。另外,使用const 可以进行类型检查和调试。
猜你喜欢
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 2017-12-30
相关资源
最近更新 更多